鏈表,一種線性表,但並不會按線性的順序存儲數據。而是在每個節點裏存到下一個節點的指針(Pointer)。因爲沒必要須按順序存儲,鏈表在插入的時候能夠達到O(1)的複雜度,比另外一種線性表順序錶快得多,可是查找一個節點或者訪問特定編號的節點則須要O(n)的時間,而順序表相應的時間複雜度分別是O(logn)和O(1)。函數
結點類型描述指針
typedef struct LinkList{ ElemType data; //數據域 struct Node *next; //指針域 }Node, *LinkList;
初始化code
LinkList initList() { LinkList L = (LinkList)malloc(sizeof(Node)); L->next = NULL; return L; }
頭插法input
LinkList List_headInsert(LinkList L) { Node *s; int x; printf("input the Node number:\n"); scanf("%d",&x); while(x!=9999) //輸入9999時結束 { s = (Node*)malloc(sizeof(Node)); s->data = x; s->next = L->next; L->next = s; scanf("%d",&x); } return L; }
尾插法it
LinkList List_TailInsert(LinkList L) { int x; Node *s; Node *r = L; printf("input the Node number:\n"); scanf("%d",&x); while(x!=9999) { s = (Node*)malloc(sizeof(Node)); s->data = x; r->next = s; r = s; //指向新的表尾結點 scanf("%d",&x); } r->next = NULL; return L; }
查找List
//按序號查找結點值,取出鏈表L中第i個位置結點 Node *GetElem(LinkList L,int i) { int num = 1; Node *p = L->next; if(i==0) return L; if(i<1) return NULL; while(p && num<i) { p = p->next; num++; } return p; }
//按值查找結點 Node *LocateElem(LinkList L,ElemType e) { Node *p = L->next; while(p!=NULL && p-data!=e) { p = p->next; } return p; }
插入鏈表
將值爲e的新結點插入到單鏈表的第i個位置next
LinkList NodeInsert(LinkList L,int i,ElemType e) { Node *p = L; int num = 0; Node *s = (Node*)malloc(sizeof(Node)); //這裏也能夠直接調用前面的GetElem函數 //p = GetElem(L,i-1); while(p && num<i-1) { p = p->next; num++; } s->data = e; s->next = p->next; p->next = s; return L; }
刪除數據
將某個給定的結點刪除,按照序號刪除,或者按照值刪除,下面實現按序號刪除時間
LinkList NodeDelete(LinkList L,i) { Node *p; Node *q; p = GetElem(L,i-1); q = p->next; p->next = p->next->next; free(q); return L; }
求表長
int ListLength(LinkList L) { Node *p = L->next; int i = 0; while(p) { i++; p = p->next; } return i; }