/*动态链表:
辅助指针变量:头结点pHead,当前节点pend,前驱节点ppre,后继节点pnew
新建节点pmalloc
链表编程关键点两点:
1:指针指向谁,就把谁的地址赋给指针,code=diagram条件反射。
2:辅助指针变量&操作逻辑的关系。
概念,基本操作:
一:建立带有头结点的单向链表
编写函数SList_Creat,建立带有头结点的单向链表,循环创建节点,节点数据域中的数值从键盘输入,
以-1作为输入结束的标志。链表的头结点地址由函数值返回。
二: 顺序访问链表中各节点的数据域
编写函数SList_Print,顺序输出单向链表各项节点数据域中的内容。
三: 在单向链表中插入节点
编写函数SList_Nodeinsert.功能:在值为x的节点前,插入值为y的节点;若值为x的节点不存在,则插在表尾。
四:删除单向链表中的节点
编写函数为SList_NodeDel,删除值为x的节点。 */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct slist
{
int data;
struct slist *next;
}slist;
slist *slist_creat()//创建一个链表
{
struct slist *phead=NULL,*pend,*pnew;
int icount=0;
pend=pnew=(slist *)malloc(sizeof(slist));
printf("请输入第一个数据:");
scanf("%d",&pnew->data );
while(pnew->data !=-1)
{
icount++;
if(icount==1)
{
pnew->next =phead;//使指针指向为空
pend=pnew;//跟踪新加入的节点
phead =pnew;//头指针指向首节点。
}
else {
pnew->next =NULL;//新节点的指针为空
pend->next =pnew;//原来的节点指向新节点
pend=pnew;//pend指向新节点,就是吧新节点加入后名字变成现在的节点。
}
pnew=(slist *)malloc(sizeof(slist));
printf("请输入数据:");
scanf("%d",&pnew->data );
}return phead;
}
int sList_Print(slist *phead)//链表的遍历
{
slist *ptmp;
ptmp=phead;
if(ptmp==NULL)
{
return NULL;
}
while(ptmp)
{
printf("%d ",ptmp->data );
ptmp=ptmp->next ;
}
}
int slist_nodeinsert(slist *phead,int x,int y)//插入节点 ,在x之前插入y
{
slist *pend,*pnew,*t,*ppre;
//创建新的业务节点
t=(slist *)malloc(sizeof(slist));
if(t==NULL)
{
return NULL;
}
t->next =NULL;
t->data =y;
//遍历链表
ppre=phead;
pend=phead->next;//对两个移动监测节点的初始化
while(pend)
{
if(pend->data ==x)
{
break;
}
ppre=pend;//ppre指向当前节点
pend=pend->next ;//当前节点指向下一个节点
}
t->next = ppre->next ;
ppre->next =t;//在x前插入y,t就是那个新节点
return 0;
}
int sList_NodeDel(slist *phead,int y )//删除节点
{
slist *pend,*pnew,*t,*ppre;
ppre=phead;
pend=phead->next ;//定义两个移动的节点
while(pend)
{
if(pend->data ==y)//判断是否找到需要删除的节点
{
break;
}
ppre=pend;
pend=pend->next ;//如果没找到,那么那两个移动的节点继续向后移动
}
if(pend==NULL)// 遍历完毕,如果没有找到需要删除的就执行该功能
{
printf("没有找到节点值\n");
return -1;
}
ppre->next =pend->next; //一步就行,然该节点前面的节点指向后面的节点
if(pend!=NULL)
{
free(pend);//从链表中截断后释放该节点。
}
return 0;
}
int slist_Destory(slist *phead)//链表的销毁
{
slist *ptmp=NULL;
if(phead==NULL)
{
return -1;
}
while (phead!=NULL)
{
ptmp=phead->next ;//删除之前先缓存剩下的节点,就这样循环,将头结点一个一个删除掉。
free(phead);
phead=ptmp;
}
return 0;
}
int main()
{
slist *phead=NULL;
phead=slist_creat();
sList_Print(phead);
printf("\n");
slist_nodeinsert(phead,20,19);//插入节点 ,在x之前插入y
sList_Print(phead);
printf("\n");
sList_NodeDel(phead,19); //删除节点
sList_Print(phead);
printf("\n");
slist_Destory(phead);//破坏链表
return 0;
}
C中链表的系统概念
最新推荐文章于 2022-03-06 14:04:18 发布