線性表及其實現—鏈式儲存(連結串列篇)
阿新 • • 發佈:2021-07-26
線性表的鏈式儲存實現
不要求邏輯上相鄰的兩個元素物理上也相鄰;通過“鏈”建立起資料元素之間的邏輯關係。
• 插入、刪除不需要移動資料元素,只需要修改“鏈”。
typedef struct lnode *list; //取別名 struct lnode *結構體指標等價於list
struct lnode{ //建立結構體
int data; ///儲存資料部分
list next; //儲存下一個結點
};
struct lnode l; //定義一個結構體 l
list ptrL; //定義一個結構體指標變數
主要操作的實現
1、求連結串列長度
int length(list ptrl) //形參 連結串列的頭結點 { list p=ptrl; /* p指向表的第一個結點*/ int j=0; while (p){ p=p->next; //指標向後移動,遍歷整個連結串列 j++ //遍歷連結串列的同時記錄連結串列長度 } return j; }
2.1按序號查詢
list findkth(int k;list ptrl)
{ list p=ptrl; //將頭節點的地址賦給p
int i=1;
while(p!=NULL&&i<k){
p=p->next;
i++;
}
if(i==k)return p; /* 找到第K個,返回指標 */
else return NULL; /* 否則返回,返回空 */
}
2.2按值查詢 :
list find(int x;list ptrl) { list p=ptrl; while (p!=null&&p->data!=x) p=p->next; return p; }
3.插入操作的實現(在第 i-1(1≤i≤n+1)個結點後插入一個值為X的新結點)
/(1)先構造一個新結點,用s指向;
(2)再找到連結串列的第 i-1個結點(即要插入位置的前一個結點),用p指向;
(3)然後修改指標,插入結點 ( p之後插入新結點是 s/
list insert( int x, int i, list ptrL ) { list p, s; if ( i == 1 ) { /* 新結點插入在表頭 */ s = (list)malloc(sizeof(struct lnode)); /*申請、填裝結點*/ s->data = x; s->next = ptrL; return s; /*返回新表頭指標*/ } p = findkth( i-1, ptrL ); /* 查詢第i-1個結點 通過 findkth函式查詢 返回 其地址 if ( p == NULL ) { /* 第i-1個不存在,不能插入 */ printf("引數i錯"); return NULL; }else { s = (list)malloc(sizeof(struct lnode)); /*申請、填裝結點*/ s->data = x; s->next = p->next; /*新結點插入在第i-1個結點的後面*/ p->next = s; return ptrL; }
- 刪除(刪除連結串列的第 i (1≤i≤n)個位置上的結點)
//(1)先找到連結串列的第 i-1個結點,用p指向;
//(2)再用指標s指向要被刪除的結點(p的下一個結點);
//(3)然後修改指標,刪除s所指結點;
//(4)最後釋放s所指結點的空間。
list delete( int i,list ptrl)//傳入 要刪除節點的序號,和連結串列的頭結點
{
list p,s;
if(i==1)
{//如果要刪除的結點就是頭結點
s=ptrl;
if(ptrl!=NULL)ptrl=ptrl->next;
else return NULL;
free(s);
return ptrl;
}
p=findkth(i-1,ptrl); /*查詢第i-1個結點*/
if ( p == NULL )
{
printf(“第%d個結點不存在”, i-1); return NULL;
}
else if ( p->next == NULL )
{
printf(“第%d個結點不存在”, i); return NULL;
}
else
{
s = p->next; /*s指向第i個結點*/
p->next = s->next; /*從連結串列中刪除*/
free(s); /*釋放被刪除結點 */
return ptrL;
}
}
}
}