頭文件Linear.h
// 單鏈表的類型定義 typedef struct node { int data; // 數據域 struct node *next; // 指針域 }Node, *LinkList;
因為單鏈表頭結點和插入的結點要動態生成,所以要引入系統頭文件<stdlib.h>或者<malloc.h>,不然會報錯。
1. 初始化單鏈表
LinkList InitiateLinkList() { LinkList head; // 頭指針 head = malloc(sizeof(Node)); // 動態創建頭結點 head->next = NULL; return head; }
2. 求單鏈表的長度:出了頭結點的所有結點的個數,包括首結點
int LengthLinkList(LinkList head) { int cnt = 0; Node *p = head; while(p->next != NULL) { p = p->next; cnt++; } return cnt; }
3.讀表元素
在單鏈表head中查找第i個元素結點。若找到,返回指向該節點的指針,否則返回NULL
Node * GetLinkList(LinkList head, int i) { int c = 1; Node *p; p = head -> next; // 初始化時,p指向首結點 while((c < i) && (p != NULL)) { p = p->next; c++; } if(c == i) return p; else return NULL;/**/ }
4. 插入元素
在表head的第i個數據元素結點之前插入一個以x為值的新結點
void InsertLinkList(LinkList head, int x, int i) { Node *p, *q; if(i == 1) q = head; else q = GetLinkList(head, i - 1); // 找到第i - 1個數據元素結點,方便在其后插入 if(q == NULL) printf("找不到插入位置。\n"); else { p = malloc(sizeof(Node)); p->data = x; p->next = q->next; q->next = p; } }
5. 單鏈表刪除
刪除表head的第i個結點
void DeleteLinkList(LinkList head, int i) { // 先找到待刪結點的直接前驅 Node *q, *p; if(i == 1) q = head; else q = GetLinkList(head, i - 1); // 若前驅結點存在且待刪結點存在 if(q != NULL && q->next != NULL) { p = q->next; q->next = p->next; free(p); // 釋放已移出結點p的空間 } else { printf("找不到待刪結點\n"); } }
6.遍歷單鏈表
void traverseList(LinkList head) { Node *p; p = head->next; while(p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); }
7. 定位
求表head中第一個值等於x的結點的序號,若不存在這種結點,返回結果為0
int LocateLinkList(LinkList head, int x) { int i = 0; Node * p = head; // p是工作指針 p = p->next; // 初始時p指向首結點 while(p != NULL && p->data != x) { i++; p = p->next; } if(p != NULL) return i + 1; else return 0; }
全部代碼:
#include <stdio.h> #include <stdlib.h> #include "Linear.h" // 單鏈表 // p 是工作指針 // 1. 初始化 LinkList InitiateLinkList() { LinkList head; // 頭指針 head = malloc(sizeof(Node)); // 動態創建頭結點 head->next = NULL; return head; } // 2. 求表長 int LengthLinkList(LinkList head) { int cnt = 0; Node *p = head; while(p->next != NULL) { p = p->next; cnt++; } return cnt; } // 3. 讀表元素 // 在單鏈表head中查找第i個元素結點。若找到,返回指向該節點的指針,否則返回NULL Node * GetLinkList(LinkList head, int i) { int c = 1; Node *p; p = head -> next; // 初始化時,p指向首結點 while((c < i) && (p != NULL)) { p = p->next; c++; } if(c == i) return p; else return NULL;/**/ } // 4. 插入元素 // 在表head的第i個數據元素結點之前插入一個以x為值的新結點 void InsertLinkList(LinkList head, int x, int i) { Node *p, *q; if(i == 1) q = head; else q = GetLinkList(head, i - 1); // 找到第i - 1個數據元素結點,方便在其后插入 if(q == NULL) printf("找不到插入位置。\n"); else { p = malloc(sizeof(Node)); p->data = x; p->next = q->next; q->next = p; } } // 5. 單鏈表刪除 // 刪除表head的第i個結點 void DeleteLinkList(LinkList head, int i) { // 先找到待刪結點的直接前驅 Node *q, *p; if(i == 1) q = head; else q = GetLinkList(head, i - 1); // 若前驅結點存在且待刪結點存在 if(q != NULL && q->next != NULL) { p = q->next; q->next = p->next; free(p); // 釋放已移出結點p的空間 } else { printf("找不到待刪結點\n"); } } // 6.遍歷單鏈表 void traverseList(LinkList head) { Node *p; p = head->next; while(p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } // 7. 定位 // 求表head中第一個值等於x的結點的序號,若不存在這種結點,返回結果為0 int LocateLinkList(LinkList head, int x) { int i = 0; Node * p = head; // p是工作指針 p = p->next; // 初始時p指向首結點 while(p != NULL && p->data != x) { i++; p = p->next; } if(p != NULL) return i + 1; else return 0; } main() { // 初始化變量 LinkList head; int cnt; head = InitiateLinkList(); printf("初始化成功!\n"); cnt = LengthLinkList(head); printf("單鏈表的長度:%d\n", cnt); // 單鏈表插入結點 InsertLinkList(head, 1, 1); InsertLinkList(head, 88, 2); InsertLinkList(head, 4, 3); InsertLinkList(head, 7, 4); InsertLinkList(head, 13, 5); InsertLinkList(head, 6, 6); InsertLinkList(head, 2, 7); cnt = LengthLinkList(head); printf("單鏈表的長度:%d\n", cnt); // 遍歷單鏈表 traverseList(head); // 刪除結點 DeleteLinkList(head, 6); traverseList(head); printf("結點的值為88的序號為:%d\n", LocateLinkList(head, 88)); }
一般的單鏈表結束。特殊的沒寫。