C語言程式設計(資料結構)——尾插法
阿新 • • 發佈:2020-12-12
尾插法
一開始頭指標和尾指標都指向頭結點,然後往裡邊插入元素,
每插入一個元素尾指標就後移一下,現在我們的尾指標就指向我們連結串列中最後一個結點了
現在我們開始插入一個新的節點,怎麼做呢?
我們需要從記憶體找到一塊相應的空間,然後將這個空間的地址儲存在,指標變數p當中,這個情況,就稱作p指向我們的元素的新節點
然後我們將新節點的資料域插入我們想要插入的元素,然後將他的指標域設定為空
然後使用尾插法將這個節點插入到我們的連結串列當中去
實際上就是給元素的最後一個節點的指標域賦值,賦值誰呢,,,
賦值的值就是我們的p指標所指向的新節點的地址,把p指標變數所指向的節點的地址賦值給前一個我們想插入的節點的指標域(尾指標所指向的next域),
簡而言之,言而簡之,就是分三步
開闢新空間,
資料域賦值我們想要插入的資料,指標域為空,指標變數p指向新節點的地址,
然後用連結串列的尾指標指向新的節點的地址,
最後將新建的空間地址的指標變數的值賦值給前尾指標的地址,尾指標指向的地址就變成了新插入節點的地址
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next; //指向後繼結點
} LinkNode;
void CreateListR(LinkNode *&L, ElemType a[], int n)
{ int i;
LinkNode * s,*r;
L = (LinkNode *)malloc(sizeof(LinkNode));
r=L;
for(i=0;i<n;i++)
{
s = (LinkNode *)malloc(sizeof(LinkNode));
s->data = a[i];
r->next = s;
r=s;
}
r->next=NULL;
}
void DispList(LinkNode *L){
LinkNode * p = L->next; //p指向首節點
while(p != NULL){ //p不為NULL,輸出p節點的data
printf("%d ", p->data);
p = p->next; //p移向下一個節點
}
printf("\n");
}
int main()
{
LinkNode *h;
ElemType a[10]={0,1,2,3,4,5,6,7,8,9};
CreateListR(h,a,10);
DispList(h);
return 0;
}
上述演算法裡,動態申請新結點空間時未加錯誤處理,這對申請空間極少的程式而言不會出問題。但在實用程式裡,尤其是對空間需求較大的程式,凡是涉及動態申請空間,一定要加入錯誤處理以防系統無空間可供分配。