在資料的刪除和增加方面,單向鍊錶的操作更加方便,只需要找到相應的節點,然後刪除該節點或者在這個節點之後增加乙個節點,不需要對其他節點進行移動。而順序表在資料的隨機讀取方面更加便利,不需要從頭結點乙個節點乙個節點的後移。
在單向鍊錶上,對於指標的移動,只能從前到後。所以,如果要獲的指標前的乙個資料,只能讓指標從鍊錶的頭部開始往後移,如此做會占用大量的時間,擴大運算的時間複雜度。然而雙向鍊錶通過多定義乙個指標指向前乙個節點,使指標可以往前移動,從而減少不必要的操作。
兩種資料結構類似,只是單向迴圈鍊錶的最後乙個節點的指標域指向的是第乙個節點,不是null。而且通過定義兩個指標,乙個指向第乙個節點,另乙個指向最後乙個節點作為標記。防止隨後輸入的資料把之前輸入的資料覆蓋。
我把單向鍊錶的基本操作分為:建立頭結點、鍊錶插入節點到正指向指標cur後、鍊錶的指標cur定長n移動、用指標cur搜尋某值為m的節點、刪除節點cur、清空鍊錶、清空表頭、輸出指標cur的值、改變指標變數cur的資料。而其他操作大多可以有這些基本操作相互結合完成。
結構體定義
typedef struct elemelem,*elemp;
typedef struct sqlist,*sqlistp;
建立頭結點函式status initlist(&l)
鍊錶插入節點到正指向指標cur後函式status addlist(&l,m)
elemp p1=(elemp)malloc(sizeof(elem));//申請空間
if(!p1) return error;
p1->next=l->cur->next; l->cur->next=p1; p1->data=m;//節點賦值
l->cur=l->cur->next;//移動指標到新增節點
l->elem_length++;//節點數加一
return ok;
}
鍊錶的指標cur定長n移動函式(起始位置為0)status movelist(&l,n)
if(n>l->elem_length)
else
}
用指標cur搜尋某值為m的節點函式status searchlist(&l,m)
l->cur=l->head;
for(;l->cur->next!=null&&l->cur->data!=m;) l->cur=l->cur->next;
if(l->cur->data!=m)
else
}
刪除節點cur函式stastus dellist(&l)
if(l->cur==l->tail)
p2=l->cur;
l->cur=l->cur->next;
free(p2);//釋放節點
l->elem_length--;//節點數減一
return ok;
}
清空鍊錶函式status delalllist(&l)
else
l->tail=l->head;//表頭賦值
l->head->next=null;
l->elem_length=0;
return ok;
}}
清空表頭函式status del(&l)
if(l->head->next!=null)
else
}
輸出指標cur的值函式status printflist(&l)
else if(l->elem_length==0)
else
}
改變指標變數cur的資料函式status printflist(&l,m)
else if(l->elem_length==0)
else
}
C語言 單向鍊錶的基本操作
define crt secure no warnings include include include typedef struct node node 建立頭節點和鍊錶 鍊錶的頭結點位址由函式值返回 node slistcreat return head 鍊錶的遍歷 int slistprin...
c語言單向鍊錶基本操作學習
鍊錶是一種常見的基礎資料結構,結構體指標在這裡得到了充分的利用。鍊錶可以動態的進行儲存分配,也就是說,鍊錶是乙個功能極為強大的陣列,他可以在節點中定義多種資料型別,還可以根據需要隨意增添,刪除,插入節點。鍊錶都有乙個頭指標,一般以head來表示,存放的是乙個位址。鍊錶中的節點分為兩類,頭結點和一般節...
C 自定義鍊錶
c 中的鍊錶結構在程式中十分常見,用處很廣。鍊錶結構中,每個節點由值部分和指標部分組成,值部分即儲存的資料,指標指向下乙個節點,從而使得每個節點能夠連線起來,值和指標就像骨骼和關節一樣。自定義鍊錶,首先定義出節點的結構,用類表示為 public class node定義完節點,下面開始構造list鍊...