1. 程式人生 > >第一篇部落格—c語言單鏈表的基本操作

第一篇部落格—c語言單鏈表的基本操作

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;
}

總結

簡單的寫了下單鏈表的建立,遍歷,排序,刪除,新增,可能用的方法不是最優化的,自己的第一篇部落格,有可能有問題,望大家指出。