第一篇部落格—c語言單鏈表的基本操作
阿新 • • 發佈:2019-02-18
c語言單鏈表的基本操作
對於c語言的初學者來說,連結串列是一塊大難點,其中用到結構體,指標的知識,這裡講的是最簡單的單鏈表,連結串列是一種動態儲存方式,和陣列相比,連結串列的優點是方便插入,沒有上限的儲存(相對來說),缺點也很明顯,排序很煩,查詢也很麻煩。
首先建立結構體
連結串列中,每一個節點都是一個結構體元素,一個數據域,一個指標域,靠指標連結在一起
struct node{
int date;
//存放資料
struct node * next;
//存放下一個節點的地址
};
建立一個連結串列
在建立連結串列時,有3個重要的位置,頭指標,首結點,尾節點。
頭指標:是個結構體指標,它指向首節點的地址;
首節點:第一個結構體元素,它的指標域存放第2個節點的地址;
尾節點:最後一個結構體元素,它的指標域存放NULL;
struct node * Creat()
{
struct node *phead,*pnew,*pend;
pnew=pend=(struct node*)malloc(sizeof(struct node));
int n=0;
phead=NULL;
//phead是頭指標,先讓其指向NULL
scanf("%d",&pnew->date);
pnew->next=NULL;
while(pnew->date!=0)
//只要輸入的資料域不為0,迴圈條件
{
n++;
if (n==1)
//判定是否為首節點
{
pnew->next=NULL;
pend=pnew;
phead=pnew;
}
else
{
pnew->next=NULL;
pend->next=pnew;
pend=pnew;
}
pnew=(struct node*)malloc(sizeof(struct node));
scanf("%d" ,&pnew->date);
}
return phead; //返回頭指標
}
連結串列的輸出
對於連結串列的輸出蠻簡單的。只要接受到頭節點,不斷的往下走,當指標域是NULL,就是尾節點了,靠這個來終止輸出哈
void Print(struct node * phead)
{
struct node *t;
t=phead;
while(t!=NULL)
{
printf("%d ",t->date);
t=t->next;
}
}
連結串列的插入
這裡我用的是頭插法,比較簡單低價的方法哈,就是申請個結構體變數的空間,然後讓其指標域指向頭結點,讓它的指標當首指標
struct node*Insert(struct node*phead)
{
struct node*p;
p=(struct node*)malloc(sizeof(struct node));
scanf("%d",&p->date);
p->next=phead;
phead=p;
return phead;
}
連結串列的刪除
對於連結串列的輸出有好多方法,我這裡用的是一種優化了的方法,分兩種情況,刪除的數是是在首節點,刪除的數不在首節點。
struct node* Delete(struct node*phead,int n)
{
struct node*p,*t;
p=phead;
if(phead->date==n)
{
phead=phead->next;
}
else
{
while(p->date !=n && p->next!=NULL)
{
t=p;
p=p->next;
}
if(p->date==n)
{
t->next=p->next;
}
}
return phead;
連結串列的排序
就簡單的按一起氣泡排序的思想排哈,只是交換了資料域,指標域沒變化。
struct node * Sort(struct node*phead)
{
struct node *p,*q;
int temp;
for(p = phead;p->next!=NULL;p=p->next){
for(q=p->next;q!=NULL;q=q->next){
if(p->date < q->date)
{
temp=p->date;
p->date=q->date;
q->date=temp;
}
}
}
return phead;
}
總結
簡單的寫了下單鏈表的建立,遍歷,排序,刪除,新增,可能用的方法不是最優化的,自己的第一篇部落格,有可能有問題,望大家指出。