C中链表的系统概念

/*动态链表:
辅助指针变量:头结点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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值