連結串列基礎2(超簡單)--單連結串列的插入和刪除
這篇文章是基於連結串列基礎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;
}
}
執行結果如圖:
感謝評閱,如有問題可以在評論區或者私信我!感謝評閱,歡迎指正交流。
相關文章
- 單向迴圈連結串列——查詢、刪除、插入結點
- 【連結串列問題】刪除單連結串列的中間節點
- 【連結串列問題】打卡2:刪除單連結串列的第 K個節點
- 資料結構:單迴圈連結串列的建立插入與刪除資料結構
- 連結串列 - 單向連結串列
- 【連結串列問題】打卡3:刪除單連結串列的中間節點
- 簡單的單向連結串列
- 結點插入到單連結串列中
- 連結串列-單連結串列實現
- 資料結構__連結串列_單連結串列的初始化、插入、刪除、修改、查詢列印(基於C語言實現)資料結構C語言
- 資料結構_連結串列_單向迴圈連結串列 & 雙向連結串列的初始化、插入、刪除、修改、查詢列印(基於C語言實現)資料結構C語言
- 雙向連結串列————查詢、刪除、插入結點
- c語言單連結串列的實現,包括連結串列的建立、插入、查詢、刪除、列印、長度計算C語言
- 手寫單連結串列基礎之增,刪,查!附贈一道連結串列題
- 單連結串列
- 資料結構實驗之連結串列七:單連結串列中重複元素的刪除資料結構
- 連結串列入門與插入連結串列
- 6-8 單連結串列結點刪除 (20 分)
- 資料結構之單連結串列的建立與刪除資料結構
- 資料結構-單連結串列、雙連結串列資料結構
- 單連結串列的排序(插入,選擇,冒泡)排序
- 單向加頭連結串列的[構建、插入、刪除、查詢、輸出]
- 資料結構_連結串列_單向迴圈連結串列的初始化、插入、刪除、修改、查詢列印(基於C語言實現)資料結構C語言
- 單雙連結串列
- 單連結串列建立連結串列出現問題
- 單連結串列的建立
- 簡單連結串列——尾插法
- leetcode:21. 合併兩個有序連結串列(連結串列,簡單)LeetCode
- 連結串列基礎總結
- 資料結構與演算法——連結串列 Linked List(單連結串列、雙向連結串列、單向環形連結串列-Josephu 問題)資料結構演算法
- 55-將單連結串列原地逆置(有頭結點的單連結串列)
- 為什麼陣列查詢比連結串列要快?而插入刪除比連結串列效率低陣列
- 單連結串列成環
- 棧_單向連結串列
- 12.19單向連結串列
- 結構與演算法(03):單向連結串列和雙向連結串列演算法
- 單向連結串列的建立
- 單連結串列實現增刪改查