//单链表定义及各类 *** 作 #include#include #include #include typedef int Elemtype; //定义单链表节点类型 typedef struct LNode { Elemtype data; //数据域 struct LNode *next; //指针域 } linkList; //初始化单链表 int InitList(linkList *L){ L = NULL; //空表 printf("初始化完成n"); return 0; } //按位查找,返回目标节点 linkList *GetElem(linkList *L, int i){ int j = 0; //计数,初始为0 linkList *p = L; if (i<1) //i无效,返回NULL return NULL; while (j < i) { p = p->next; j++; } return p; } //按值查找,返回目标节点 linkList *LocateElem(linkList *L, Elemtype e){ linkList *p = L->next ; while (p != NULL && p->data != e) { p = p->next; } return p; } //按位插入(带头节点) bool ListInsert(linkList *L, int i, Elemtype e){ if (i < 0) return false; // //不带头节点 // if (i == 1){ // linkList *s = (linkList *)malloc(sizeof(linkList)); // s->data = e; // s->next = L; // L = s; // return true; // } linkList *p = L; int j = 0; //找到(i-1)节点 while (p != NULL && j < (i - 1)) { p = p->next; j++; } if (p == NULL) return false; //i超出链表长度,不合法 linkList *s = (linkList *)malloc(sizeof(linkList)); //分配内存空间 s->data = e; s->next = p->next; p->next = s; printf("插入成功n"); return true; } //后插:在p节点后插入元素e bool InsertNextNode(linkList *p, Elemtype e){ if (p == NULL) return false; linkList *s = (linkList *)malloc(sizeof(linkList)); if (s == NULL) return false; //内存分配失败 s->data = e; s->next = p->next; p->next = s; return true; } //前插:在p节点前插入元素e bool InsertPriorNode(linkList *p, Elemtype e){ if (p == NULL) return false; linkList *s = (linkList *)malloc(sizeof(linkList)); if (s == NULL) return false; //内存分配失败 s->next = p->next; p->next = s; //s作为p的后继节点 s->data = p->data; //p中数据复制到s中 p->data = e; //元素e覆盖p中数据 return true; } //删除(带头节点) bool ListDelete(linkList *L, int i){ if (i < 0 ) return false; linkList *p = L; int j = 0; //找到(i-1)节点 while (p != NULL && j < (i - 1)) { p = p->next; j++; } if (p == NULL) return false; //i超出链表长度,不合法 linkList *q = p->next; //q指向需要被删除节点 p->next = q->next; free(q); return true; } //删除指定节点p(p不是最后的节点) bool DeleteNode(linkList *p){ linkList *q = p->next; p->data = q->data; //后继节点中数据覆盖p中数据 p->next = q->next; //将q从链中断开 free(q); return false; } //求单链表表的长度 int ListLength(linkList *L){ int len = 0; linkList *p = L; while (p->next != NULL) { p = p->next; len++; } return len; } //尾插法建立单链表 linkList ListTailInsert(linkList *L){ L = (linkList *)malloc(sizeof(linkList));//申请地址,建立链表 linkList *p, *q = L; int x; scanf("%d", &x); while (x != 9999)//输入9999结束 { q = (linkList *)malloc(sizeof(linkList)); q->data = x; p->next = q; p = q; scanf("%d", &x); } p->next = NULL; return *L; } //头插法建立单链表 linkList ListHeadInsert(linkList *L){ L = (linkList *)malloc(sizeof(linkList));//申请地址,建立链表 L->next = NULL;//初始为空链表 linkList *s; int x; scanf("%d", &x); while (x != 9999) { s->data = x; s->next = L->next; L->next = s; scanf("%d", &x); } return *L; } //打印单链表中的所有元素 void PrintfList(linkList *L){ linkList *p = L->next; while (p != NULL) { printf("%d", p->data); p = p->next; } } //单链表逆置 linkList *Reverselist(linkList *L){ if (L == NULL || L->next == NULL) return L; linkList *pRev = NULL; linkList *pCur = L; while (pCur != NULL) { linkList *pTemp = pCur; pCur = pCur->next; pTemp->next = pRev; pRev = pTemp; } return pRev; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)