无空头链表详解(增删改查)
生活随笔
收集整理的這篇文章主要介紹了
无空头链表详解(增删改查)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
#include <stdio.h>
#include <stdlib.h>//節(jié)點結(jié)構(gòu)體
struct Node
{int a;struct Node *pNext;
} ;//鏈表的頭尾指針
struct Node *g_pHead=NULL;
struct Node *g_pEnd=NULL; //鏈表清空 需要遍歷
void qingkong() ;
//創(chuàng)建鏈表,在鏈表中增加一個數(shù)據(jù)(頭添加)
void Add(int a);
//遍歷鏈表,查,查指定的
void chakan() ;
//查詢指定節(jié)點
struct Node *SelectNode(int a);
//指定位置插入節(jié)點
void charu(int index,int a);//頭添加+頭刪除=棧//頭添加+ 尾刪除 或者:尾添加+頭刪除 =隊列//頭刪除
void shanchutou();
//尾刪除
void shanchuwei();
//刪除指定節(jié)點
void ShanChuZhiding(int a);int main()
{int a[]={1,2,3};//數(shù)組傳進(jìn)鏈表 int i=0;for(i=0;i<3;i++){Add(a[i]);}chakan() ;//遍歷 charu(1,5);//在1的后面添加5 //查找指定的struct Node *pFind=SelectNode(3) ;if(pFind!=NULL) //找到了{(lán)printf("%d\n",pFind->a );} elseprintf("沒有查找到相應(yīng)數(shù)據(jù)");printf("\n"); chakan() ;//遍歷 printf("\n"); shanchutou();//刪除頭 chakan() ;//遍歷 printf("\n"); shanchuwei();chakan() ;//遍歷 printf("\n"); ShanChuZhiding(2);//刪除2 chakan() ;//遍歷 qingkong(); system("pause");return 0;
}//鏈表清空 需要遍歷
void qingkong()
{struct Node *pTemp=g_pHead;//定義一個 pTemp指針指向開頭 while(pTemp!=NULL){struct Node *pt=pTemp;//不可以free(pTemp) pTemp=pTemp->pNext;free(pt); //先定義一個指針去記錄 pTemp再釋放 g_pHead=NULL;g_pEnd=NULL;//頭尾清空 }
}//創(chuàng)建鏈表,在鏈表中增加一個數(shù)據(jù)(頭添加)
void Add(int a)
{struct Node *pTemp=(struct Node *)malloc(sizeof(struct Node));pTemp->a=a;pTemp->pNext=NULL;//必須 if(g_pHead==NULL){g_pHead=pTemp;g_pEnd=pTemp;}else{pTemp->pNext=g_pHead;g_pHead=pTemp;}
}//遍歷鏈表,查,查指定的
void chakan()
{struct Node *pTemp=g_pHead;//定義一個 pTemp指針指向開頭 while(pTemp!=NULL){printf("%d\n",pTemp->a ); pTemp=pTemp->pNext;}
}//查詢指定節(jié)點
struct Node *SelectNode(int a)
{struct Node *pTemp=g_pHead;//定義一個 pTemp指針指向開頭 while(pTemp!=NULL){if(pTemp->a==a){return pTemp;}pTemp=pTemp->pNext;}return NULL; //沒找到
}//指定位置插入節(jié)點
void charu(int index,int a)
{if(NULL==g_pHead){printf("鏈表沒有節(jié)點"); return ; }//找位置struct Node *pt= SelectNode(index);if(pt==NULL){printf("沒有指定節(jié)點/n");}//有節(jié)點,給a創(chuàng)建節(jié)點 struct Node *pTemp=(struct Node *)malloc(sizeof(struct Node));pTemp->a=a;pTemp->pNext=NULL; //連接鏈表if(pt==g_pEnd){g_pEnd->pNext=pTemp;//尾巴最后一個指向新節(jié)點 g_pEnd=pTemp;//新節(jié)點最后一個變成尾巴 } else{pTemp->pNext=pt->pNext;//先連pt->pNext=pTemp;}
}//頭刪除
void shanchutou()
{if(NULL==g_pHead){printf("鏈表為空\n");}struct Node *pTemp=g_pHead;//記錄舊的頭g_pHead=g_pHead->pNext;//頭的下一個變成新的頭 free(pTemp);
}//尾刪除
void shanchuwei()
{if(NULL==g_pHead){printf("鏈表為空\n");}//鏈表不為空//鏈表有1個節(jié)點 if(g_pHead==g_pEnd){free(g_pHead);g_pHead=NULL;g_pEnd=NULL;} else //多個節(jié)點 {//找到尾巴前一個節(jié)點 struct Node *pTemp=g_pHead;while(pTemp->pNext!=g_pEnd) {pTemp=pTemp->pNext;}//找到了后:1:釋放 free(g_pEnd);g_pEnd=pTemp; //2尾巴下移g_pEnd->pNext=NULL; //3尾巴的下一條指針賦值為空 }
}//刪除指定節(jié)點
void ShanChuZhiding(int a)
{//鏈表判斷if(NULL==g_pHead){printf("鏈表為空\n");return ;}//鏈表有東西 找節(jié)點struct Node *pTemp=SelectNode(a); if(NULL==pTemp){printf("沒有節(jié)點\n");return ;}//找到了//只有一個節(jié)點if(g_pHead==g_pEnd){shanchutou();}//兩個節(jié)點else if(g_pHead->pNext==g_pEnd){if(g_pHead==pTemp){shanchutou();}else{shanchuwei();}}//多個節(jié)點 else{if(g_pHead==pTemp){shanchutou();}else if(g_pEnd==pTemp){shanchuwei();}else{//找到刪除節(jié)點的前一個節(jié)點struct Node *pT=g_pHead;while(pT->pNext!=pTemp){pT=pT->pNext;}//找到了//連接pT->pNext=pTemp->pNext;free(pTemp);//釋放 }}}
運(yùn)行結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的无空头链表详解(增删改查)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。