連結串列基礎2(超簡單)--單連結串列的插入和刪除

玫瑰花店發表於2020-10-30

這篇文章是基於連結串列基礎1(超簡單)–建立一個長度為n的單連結串列所寫的,需要看基礎的可以跳過去,連結串列的基礎知識這裡就不在講了。

我們首先來看一下連結串列的刪除,話不多說直接上圖。

在這裡插入圖片描述
如圖,比如我們要刪除B這個節點。我們先來看一下刪除後的圖。一對比你就明白啦!
在這裡插入圖片描述
兩個圖一對比你就發現,如果我們要刪除B節點,我們首先要將B節點的前後兩個節點A,C連起來,這樣B不就孤立了嘛,我們就可以給他free掉了!是不是灰常簡單呀!
我們來看一下具體程式碼實現。

先看一下這個連結串列的結構

typedef struct lianbiao
{
        int date;
        struct lianbiao *pnext;
}link;
link *pnew;//新節點
link *phead;//頭節點
link *ptemp;//臨時節點
link *pdel;//刪除功能用
link *pins;//插入功能用
下面是具體刪除部分程式碼
void del(void)
{
    int x;
    int flag=0;
    printf("\n");
    printf("請輸入你要刪除的數\n");
    scanf("%d", &x);
    ptemp=phead;
    while(ptemp->pnext!=NULL)
    {
      if(ptemp->pnext->date==x)//遍歷到要刪除的節點的前一個節點
        {
            flag=1;
            break;
        }
        ptemp=ptemp->pnext;
    }
    pdel=ptemp->pnext;
    if(flag==1)
    {
        ptemp->pnext=pdel->pnext;
        free(pdel);
    }
}

好了我們刪除部分就結束了,下面我們來看一下連結串列的插入

如果你刪除看懂了插入就也很簡單啦!
比如有A,C這樣兩個節點,我們要在中間插入一個B節點,我們要如何操作呢?是不是我們只要把A 節點的指標域存放B節點的地址,然後B節點的指標域存放C節點的地址,這樣不就插入成功了嘛!是不是也很簡單啦!
話不多說上程式碼。連結串列結構還是上面那個結構

void ins(void)
{
    int y;
    int flag=0;
    printf("\n");
    printf("請輸入你要插入的數的位置\n");
    scanf("%d", &y);
    ptemp=phead;
    while(ptemp->pnext!=NULL)
    {
        if(ptemp->pnext->date==y)
        {
            flag=1;
            break;
        }
        ptemp=ptemp->pnext;
    }
    if(flag=1)
    {
        printf("已找到插入位置\n");
    }
    pnew=(link*)malloc(sizeof(link));
    pnew->date=99;
    pins=ptemp->pnext;//儲存·後一個節點地址
    ptemp->pnext=pnew;
    pnew->pnext=pins;
    printf("插入完成,輸出所有資料\n");
    ptemp=phead;
    while(ptemp!=NULL)
    {
        printf("%d ", ptemp->date);
        ptemp=ptemp->pnext;
    }

}

這就是我們插入部分程式碼,下面是一個長度為n的單連結串列的建立插入刪除完整程式碼。

#include <stdio.h>
#include <stdlib.h>

typedef struct lianbiao
{
        int date;
        struct lianbiao *pnext;
}link;
link *pnew;//新節點
link *phead;//頭節點
link *ptemp;//臨時節點
link *pdel;//刪除功能用
link *pins;//插入功能用
int count=1;
void creat(void);
void add(void);
void del(void);
void ins(void);
int main()
{
    int n,i;
    printf("請輸入所需要建立的連結串列長度,不可為0\n");
    scanf("%d", &n);
    creat();
    for(i=0;i<n-1;i++)
    {
        add();
    }
  printf("連結串列建立完畢,輸出連結串列所有資料\n");
  //printf("%d ", phead->date);
  for(ptemp=phead;ptemp!=NULL;ptemp=ptemp->pnext)
   {
       printf("%d ", ptemp->date);
   }
   ins();

   del();
   printf("刪除後的連結串列資料\n");
   ptemp=phead;
   while(ptemp!=NULL)
   {
       printf("%d ", ptemp->date);
       ptemp=ptemp->pnext;
   }
   return 0;
}
void creat(void)
{
    phead=(link*)malloc(sizeof(link));
    phead->pnext=NULL;
    phead->date=0;
    //memset(link,0,sizeof(link));
}
void add(void)
{
    pnew=(link*)malloc(sizeof(link));
    pnew->date=count;
    pnew->pnext=NULL;
    ptemp=phead;
    while(ptemp->pnext!=NULL)
    {
        ptemp=ptemp->pnext;
    }
    ptemp->pnext=pnew;
    //pnew=NULL;
    count++;
}
void del(void)
{
    int x;
    int flag=0;
    printf("\n");
    printf("請輸入你要刪除的數\n");
    scanf("%d", &x);
    ptemp=phead;
    while(ptemp->pnext!=NULL)
    {
        if(ptemp->pnext->date==x)
        {
            flag=1;
            break;
        }
        ptemp=ptemp->pnext;
    }
    pdel=ptemp->pnext;
    if(flag==1)
    {
        ptemp->pnext=pdel->pnext;
        free(pdel);
    }
}
void ins(void)
{
    int y;
    int flag=0;
    printf("\n");
    printf("請輸入你要插入的數的位置\n");
    scanf("%d", &y);
    ptemp=phead;
    while(ptemp->pnext!=NULL)
    {
        if(ptemp->pnext->date==y)
        {
            flag=1;
            break;
        }
        ptemp=ptemp->pnext;
    }
    if(flag=1)
    {
        printf("已找到插入位置\n");
    }
    pnew=(link*)malloc(sizeof(link));
    pnew->date=99;//插入資料為99
    pins=ptemp->pnext;//儲存·後一個節點地址
    ptemp->pnext=pnew;
    pnew->pnext=pins;
    printf("插入完成,輸出所有資料\n");
    ptemp=phead;
    while(ptemp!=NULL)
    {
        printf("%d ", ptemp->date);
        ptemp=ptemp->pnext;
    }

}

執行結果如圖:
在這裡插入圖片描述
感謝評閱,如有問題可以在評論區或者私信我!感謝評閱,歡迎指正交流。

相關文章