鏈式存儲結構:
結構:
數據域 |
指針域 |
Data |
Next |
結點定義:
Typedef struct LNode
{
ElemType data;
Struct LNode *next;
}LNode,*LinkList;
頭指針:LinkList即爲頭指針。本身一般不存儲信息(也可存儲長度等相關信息),指向第一個元素結點
頭結點≠頭指針 鏈表必須要頭指針,但是不一定有頭結點
頭結點的好處:①方便操作和處理(對於第一個元素而言)。②空表和非空表操作統一
操作:
- 建表
- 頭插法:將新結點插入到當前表頭
頭插法建立的數據順序與讀取的數據順序相反。
LinkListCreat_Head(LinkList &L)
{
L=(LinkList) new LNode; //創建頭結點
L->next=NULL; //初始化空鏈表
Int x;
Cin>>x;
While(x!=9999) //終止條件
{
S=(LinkList) new LNode; //創立新結點
S->data=x; //結點數據賦值
S->next=L->next; //新結點的後繼指向尾部(NULL)
L->next=S; //頭結點的後繼指向新節點
Cin>>x; //獲取下一個數據的值
}
Return L;
}
- 尾插法
LinkListCreat_Rear(LinkList &L)
{
L=(LinkList) new LNode; //創建頭結點
LNode *s,*r=L; //r爲表尾指針,指向表尾
Int x;
Cin>>x;
While(x!=9999) //終止條件
{
S=(LinkList) new LNode; //創立新結點
S->data=x; //結點數據賦值
r->next=s; //
r=s; //r指向新的表尾
Cin>>x; //獲取下一個數據的值
}
r->next=NULL; //尾結點指針置空
Return L;
}
尾插法建立的數據順序與讀取的數據順序一致。
②查找結點
1. 按序號
從第一個結點出發,順指針next域逐個往下搜索,知道找到第i個結點,否則返回最後一個結點的指針域NULL。
LNode *GetElem_Loc(LinkList L, int i)
{
If(i==0) return L; //查找第0個節點(頭結點),直接返回
LNode *P=L->next; //第一個結點賦給P
Int j=1; //用於計數
While(P&&j<i) //從第一個結點開始查找第i個結點(同時保證指向當前結點的指針不爲空)
{
P=P-next;
J++;
}
Return P;
}
2.按值
LNode *GetElem_Data(LinkList, ElemType e)
{
LNode *P=L->nextg;
While(P!=NULL&&P->data!=e)
P=P->next; //遍歷鏈表
Return P; //返回結果(沒找到就是空)
}
③插入(按位置)
P=GetElem_Loc (L,i-1); //獲取前驅指針
S->next = P->next; //將*S的指針域指向*P的後繼結點
P->next=S; //令結點*S的指針域指向新插入的結點*S
④刪除操作
P=GetElem_Loc(L,i-1); //獲取被刪除位置的前驅指針
Q=P->next; //輔助指針(指向被刪除結點)
P->next=Q->next; //P指向結點的後繼指向被刪除節點的後繼
Delete Q; //釋放內存