C语言实现链表的创建 遍历 插入删除和逆置

本段代码为我在看传智视频时根据老师讲的内容敲完了,事后陆陆续续自己敲了几次,最近很久没看 昨天晚上竟然在创建链表时就遇上了问题 故记录于此

#include<stdio.h>
typedef struct Node
{
    int data;
    struct Node *next;
}Slist;
//链表的创建  需三个辅助指针变量
Slist *Slistcreate()
{
    Slist *pHead,*pm,*pcur;
    int a;
    pHead=(Slist*)malloc(sizeof(Slist));
    if(pHead==NULL)
        return NULL;
    pHead->data=0;
    pHead->next=NULL;
    printf("Pleasr input:\n");
    scanf("%d",&a);
     pcur=pHead;
    while(a!=-1)
    {
        pm=(Slist*)malloc(sizeof(Slist));
        if(pm==NULL)
            return NULL;

        pm->data=a;
        pm->next=NULL;

        pcur->next=pm;
        pcur=pm;

        
         printf("Pleasr input:\n");
        scanf("%d",&a);
    }
return pHead;
}
//打印链表 需1个辅助指针变量
void Slistprint(Slist *pHead)
{
    Slist *tmp=pHead->next;//*tmp=pHead
    if(pHead==NULL)
        return ;
    printf("begin\n");
    while(tmp!=NULL)//t,tmp->next!=NULL
    {
        printf("%d\n",tmp->data);
        tmp=tmp->next;
    }
}
//插入链表 需三个辅助指针变量
void Slist_Insert(Slist *pHead,int x,int y)
{
    Slist *pPre=pHead;
    Slist *pcur=pHead->next;
    Slist *pm;
    pm=(Slist*)malloc(sizeof(Slist));//pm的数据域记录需查找的值
    if(pm==NULL)
        return ;
    pm->next=NULL;
    pm->data=x;
    //while(pcur->next!=NULL)//(pcur)
    while(pcur)
        {
            if(pcur->data==y)
            {break;}
              pPre=pcur;
              pcur=pcur->next;
        }
          pm->next=pPre->next;
          pPre->next=pm;
        return ;
}
//删除一个节点 相对简单
void Slist_de(Slist *pHead,int y)
{
    Slist *pm;
    //pm=(Slist*)malloc(sizeof(Slist));
   // if(pm==NULL)
        //return ;
    Slist *pre=pHead;
    Slist *pcur=pHead->next;
    //pm->next=NULL;
   // pm->data=y;
    while(pcur!=NULL)
    {
        if(pcur->data==y)
            break;
        pre=pcur;
        pcur=pcur->next;
    }
        if(pcur==NULL)
        {
            printf("NO\n");
            return ;
        }
        pre->next=pre->next->next;

}
//避免野指针问题
void Slist_destroy(Slist *pHead)
{
    if(pHead==NULL)
        return ;
    while(pHead!=NULL)
    {
        Slist *tmp=pHead;
        free(pHead);
        pHead=tmp->next;
    }
}

//链表逆置 重点理解
void inverse(Slist *pHead)
{
    Slist *p=NULL,*q=NULL,*t=NULL;
    p=pHead;
    q=pHead->next;
    if(pHead==NULL||pHead->next==NULL||pHead->next->next==NULL)
         return ;
    while(q)
    {
        t=q->next;
        q->next=p;
        p=q;
        q=t;
    }
    pHead->next->next=NULL;//头节点变成尾部节点 并使其指针域为NULL
    pHead->next=p;
}
void main()
{
    Slist *pHead=NULL;
    pHead=Slistcreate();
    Slist_Insert(pHead,19,20);
   // Slist_de(pHead,19);
   // inverse(pHead);
  //  Slistprint(pHead);
   // Slist_destroy(pHead);
}

注意创建链表的函数可以用二级指针做函数参数直接给phead赋值,也可以采用如上代码所写将堆区创建的首地址通过函数返回值丢出来。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值