本文主要是介绍链表的基本操作之_增删改查,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
<span style="font-size:32px;"><strong style="background-color: rgb(51, 255, 51);">链表的基本操作之_增删改查</strong></span>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>typedef struct Node
{int data;struct Node *next;}SLIST;SLIST *Creat_SList();
int SList_Print(SLIST *pHead);
//在节点数值为x的前面插入y
int SList_NodeInsert(SLIST *pHead,int x,int y);
//删除节点为y的链表节点。
int SList_NodeDel(SLIST *pHead,int y);
//销毁链表
int SList_Destory(SLIST *pHead);SLIST *Creat_SList()
{//1.创建头结点并初始化SLIST *pHead =NULL;SLIST *pM=NULL;//辅助指针变量SLIST *pCur;//指向最后一个节点位置的指针int data=0;pHead=(SLIST*)malloc(sizeof(SLIST));pHead->data=0;pHead->next=NULL;//2循环创建结点,结点数据域中的数值从键盘输入
//以-1作为输入结束标志printf("please input the data of node(-1 quit)");scanf("%d",&data);//准备环境 让pCur指向pHeadpCur=pHead;//一开始链表的开始也是链表的结尾;while (data!=-1){//不断的malloc新节点,并且数据域赋值pM=(SLIST*)malloc(sizeof(SLIST));pM->data=data;pM->next=NULL;//不断地新节点进入链表//1.新节点入链表pCur->next=pM;//2.当前节点下移,(新节点变成当前节点)pCur=pCur->next;//如果合法,让用户再次输入需要插入的节点。printf("please input the data of node(-1 quit)");scanf("%d",&data);}return pHead;//一定要返回,不然在以后的输出,增删查改等操作就无法利用。
}<img src="https://img-blog.csdn.net/20150420192944110?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjk4OTUzNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />//链表的打印:int SList_Print(SLIST *pHead)
{SLIST *p=NULL;//辅助指针,让它移动,依次输出。if(pHead==NULL){return -1;}//准备环境p=pHead->next;printf("\nBegin");while(p){printf("%d",p->data);p=p->next;}printf("End");return 0;
}//销毁链表int SList_Destory(SLIST *pHead)
{//删除当前节点前,需要把后继节点位置缓存SLIST *pTem=NULL;SLIST *pCur=pHead;if(pHead==NULL){return -1;}while(pCur){//缓存后继节点位置pTem=pCur->next;//删除当前节点free(pCur);//当前节点下移pCur=pTem;}return 0;
}
<img src="https://img-blog.csdn.net/20150420193014499?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjk4OTUzNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
int SList_NodeInsert(SLIST *pHead,int x,int y)//在节点数值为x的前面插入y
{SLIST *pCur = NULL,*pPre=NULL,*pM=NULL;if(pHead==NULL){return -1;}//环境准备;pPre=pHead;pCur=pHead->next;//不断的malloc新节点,并且数据域赋值pM=(SLIST *)malloc(sizeof(SLIST));pM->data=y;//????pM->next=NULL;while(pCur){if(pCur->data==x){break;}//让pPre下移pPre=pCur;//两个节点同时下移//让当前节点下移pCur=pCur->next;}//让新节点链接后继节点pM->next=pPre->next;//让前驱节点连接pMpPre->next=pM;return 0;
}
<img src="https://img-blog.csdn.net/20150420192920984?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjk4OTUzNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
//删除结点为y的链表结点
int SList_NodeDel(SLIST *pHead, int y)
{SLIST *pCur = NULL, *pPre = NULL;if (pHead == NULL){return -1;}//环境准备pPre = pHead;pCur = pHead->next;while(pCur){if (pCur->data == y){break;}//让pPre下移pPre = pCur;//让当前节点下移pCur = pCur->next;}if (pCur == NULL){printf("没有找到节点 y:%d", y);return -2;}//执行操作pPre->next = pCur->next;//让指针的指向越过将要删除的节点。free(pCur);return 0;
}
<img src="https://img-blog.csdn.net/20150420193118475?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjk4OTUzNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
int main()
{int ret = 0;SLIST *pHead = NULL;//创建 并打印 pHead = Creat_SList();ret = SList_Print(pHead);//插入操作ret = SList_NodeInsert(pHead, 20, 19);ret = SList_Print(pHead);ret = SList_NodeDel(pHead, 19);ret = SList_Print(pHead);ret = SList_Destory(pHead);return 0;
}
这篇关于链表的基本操作之_增删改查的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!