https://www.cnblogs.com/Timesi/p/12425972.htmlhtml
//帶頭節點的單鏈表 #include <stdio.h> #include <malloc.h> typedef struct LNode{ //定義單鏈表 int data; struct LNode *next; }Node , *LinkList; bool InitList(LinkList &); //初始化單鏈表 bool ListInsert(LinkList & , int , int); //在指定位置插入數據 bool Empty(LinkList); //判斷鏈表是否爲空 bool HListInsert(LinkList & , int , int); //在指定節點前面插入數據 bool RListInsert(LinkList * , int , int); //在指定節點後面插入數據 void output(LinkList); //輸出鏈表 bool ListDelete(LinkList & , int , int &); //刪除指定位置的數據 bool HeadInsert(LinkList , int); //頭插法 Node* GetElem(LinkList , int); //查找指定位置的值 int LocateElem(LinkList , int); //查找指定的值在哪一個位置 int main(void){ LinkList L; InitList(L); HeadInsert(L,5); HeadInsert(L,2); TailInsert(L,7); TailInsert(L,4); RListInsert(&L,2,3); printf("當前單鏈表中的數據是:"); output(L); printf("\n"); Node* r = GetElem(L,3); printf("你要查找的值是%d",r->data); printf("\n"); int x = LocateElem(L,7); printf("你要查找的值在第%d位",x); printf("\n"); int e = -1; ListDelete(L,2,e); printf("刪除的哪一個元素是:%d",e); printf("\n"); printf("當前單鏈表中的數據是:"); output(L); printf("\n"); if(Empty(L)){ printf("當前鏈表爲空!"); }else{ printf("當前鏈表不爲空! "); } return 0; } //初始化單鏈表 bool InitList(LinkList &L){ L = (Node*)malloc(sizeof(Node)); if(L == NULL){ return false; } L->next = NULL; return true; } //遍歷單鏈表 void output(LinkList L){ Node *p = L->next; while(p != NULL){ printf("%d ",p->data); p = p->next; } } //判斷單鏈表是否爲空 bool Empty(LinkList L){ if(L->next == NULL){ return true; }else{ return false; } } //在指定的位置插入數據 bool ListInsert(LinkList &L ,int i , int e){ if(i < 1){ return false; } Node *p = L; int j = 0; while(p != NULL && j < i-1){ p = p->next; j ++; } if(p == NULL){ return false; } Node *s = (Node*)malloc(sizeof(Node)); s->data = e; s->next = p->next; p->next = s; return true; } //在指定節點前面插入數據 bool HListInsert(LinkList &L , int i , int e){ if(i < 1){ return false; } Node *p = L; int j = 0; while(p != NULL && j < i){ p = p->next; j ++; } if(p == NULL){ return false; } Node *s = (Node *)malloc(sizeof(Node)); s->data = p->data; p->data = e; s->next = p->next; p->next = s; return true; } //在指定節點後面插入數據 bool RListInsert(LinkList *L , int i , int e){ if(i < 1){ return false; } Node *p = *L; int j = 0; while(p != NULL && j < i){ p = p->next; j ++; } if(p == NULL){ return false; } Node *s = (Node *)malloc(sizeof(Node)); s->next = p->next; p->next = s; s->data = e; } //刪除指定位置的數據 bool ListDelete(LinkList &L , int i , int &e){ if(i < 1){ return false; } Node *p = L; int j = 0; while(p != NULL && j < i-1){ p = p->next; j ++; } if(p == NULL || p->next == NULL){ return false; } Node *q = p->next; e = q->data; p->next = q->next; free(q); return true; } //頭插法 bool HeadInsert(LinkList L , int e){ Node *s = (Node *)malloc(sizeof(Node)); //L->next = NULL; //使用頭插法創建單鏈表時須要初始化next s->data = e; s->next = L->next; L->next = s; return true; } //查找指定位置的值 Node* GetElem(LinkList L , int i){ if(i < 1){ return NULL; } Node *p = L; int j = 0; while(p != NULL && j < i){ p = p->next; j ++; } return p; } //查找指定的值在哪一個位置 int LocateElem(LinkList L , int e){ Node *p = L->next; int j = 1; while(p != NULL && p->data != e){ p = p->next; j ++; } if(p == NULL){ return -1; }else{ return j; } }