這裏寫目錄標題
定義:
線性表的鏈式存儲又稱單鏈表
即:通過一組任意的存儲單元來存儲線性表當中的數據元素,數據元素存儲的位置不一定是連續的。
(有可能連續,有可能不連續)
存取方式:
通過指針實現線性的邏輯關係
鏈表不能實現隨機存取,且每個元素包含兩部分,
① data 即元素值
② *next 即下一個元素的存儲地址
所以,我們也可以使用一個指針用來表示單鏈表
單鏈表的兩種實現形式:
不帶頭結點
帶頭結點(優)
單鏈表的基本操作:
頭插法建立單鏈表:
s -> next = L -> next;
L -> next = s;
頭插法建立單鏈表:時間複雜度O(n)
LinkList List_HeadInsert(LinkList &L){
LNode *s;int x;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
scanf("%d",&x);
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=L->next;
L->next=s;
scanf("%d",&x);
}
return L;
}
尾插法建立單鏈表:
r -> next = s;
r = s;
尾插法建立單鏈表:時間複雜度O(n)
LinkList List_TailInsert(LinkList &L){
int x;
L=(LinkList)malloc(sizeof(LNode));
LNode *s,*r=L;
scanf("%d",&x);
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next=NULL;
return L;
}
按序號查找&按值查找:
兩種查找均要遍歷單鏈表,僅比較的數據不同
.
按序號查找需要給遍歷元素計數,從而找到要找的元素
.
按值查找需要比對每個元素的屬性值是否與要找的元素相同
按序號查找&按值查找:時間複雜度O(n)
按序號查找:
LNode *GetElem(LinkList L,int i){
int j=1;
LNode *p=L->next;
if(i==0) return L;
if(i<1) return NULL;
while(p&&j<i){
p=p->next;
j++;
}
return p;
}
按值查找:
LNode *LocateElem(LinkList L,ElemType e){
LNode *p=L->next;
while(p!=NULL&&p->data!=e){
p=p->next;
}
return p;
}
插入:
p = GetElem(L, i - 1);
s -> next = p -> next;
p-> next = s ;
插入操作:
前插法
在第 i 個位置前插入元素
前插法:
前插法:時間複雜度O(n)
後插法
在第 i 個位置後插入元素
後插法:
後插法:時間複雜度O(1)
可以利用後插法實現前插法
.
先在第 i 個位置插入元素 e
.
然後交換第 i 個位置和第 i - 1 個位置的值
刪除:
刪除第i個元素
p = GetElem( L, i - 1 );
q = p -> next;
p -> next = q -> next;
free(q);
刪除給定節點 *p
q=q->next;
p->data=p->next->data;
p->next=q->next;
free(q);
求表長:
求表長:時間複雜度O(n)
int count=0;
p=head;
while(p->next!=NULL){
count++;
p=p->next;
}