C语言实现数据链表的简单操作

#include<stdio.h>
#include <stdlib.h>
struct LinkList
    {
        /* data */
        int data;
        struct LinkList *next;
    };

    //创建链表
    struct LinkList *Init_LinkList(){

            //创建一个头节点(空链表)
            struct LinkList *header = malloc(sizeof(struct LinkList));
            header->data = -1;
            header->next = NULL;

            //创建一个尾部指针,使该指针始终指向链表的最后一个元素
            struct LinkList *pRear = header;

            int val = -1;
            while (1)
            {
                /* code */
                printf("请输入数据:");
                scanf("%d",&val);
                if (val == -1)
                {
                    /* code */
                    break;
                }
                //创建一个新节点
                struct LinkList *newnode = malloc(sizeof(struct LinkList));
                newnode->data = val;
                newnode->next = NULL;
                

                //将新节点newnode插入链表中

                pRear->next = newnode;

                //更新
                pRear = newnode;
            }
        return header;
            
            
    }

    //打印链表
    void Foreach_LinkList(struct LinkList *header){
        if(header ==NULL){
            return;
        }
        //定义一个辅助指针
        struct LinkList *pCurrent = header->next;
        while (pCurrent != NULL)
        {
            /* code */
            printf("%d\n",pCurrent->data);
            //把辅助指针后移
            pCurrent = pCurrent->next;
        }
        
    }



    //在oldval位置处插入一条数据newval
    void InsertByValue_LinkList(struct LinkList *header,int oldval,int newval){

        if (header == NULL)
        {
            /* code */
            return;
        }


        //创建两个辅助指针
        struct LinkList *pRev = header;
        struct LinkList *pCurrent = pRev->next;

        while (pCurrent !=NULL)
        {
            /* code */
            if(pCurrent->data==oldval){
                break;
            }
            pRev = pCurrent;
            pCurrent = pCurrent->next;
        }
        
        if (pCurrent ==NULL)
        {
            return;
        }
        

        //创建一个新节点
        struct LinkList *newnode = malloc(sizeof(struct LinkList));
        newnode->data = newval;
        newnode->next = NULL;

        //将新节点插入链表中
        newnode->next = pCurrent;
        pRev->next = newnode;           

    }
    
    //清空链表(只保留一个头部节点)
    void Clear_LinkList(struct LinkList *header){

        //先判断链表是否为空
        if (header == NULL)
        {
            /* code */
            return;
        }

        //创造一个辅助指针变量
        struct LinkList *pCurrent = header->next;
        while (pCurrent !=NULL)
        {
            /* code */
            //创建一个辅助指针变量,用于存放即将删除的那一个节点的地址
            struct LinkList *pNext = pCurrent->next;

            //释放pCurrent当下指向的节点内存
            free(pCurrent);

            //移动辅助指针变量
            pCurrent = pNext;
        }
        header->next = NULL;
        

    }



    //删除值为val的节点
    void RemoveByValue_LinkList(struct LinkList *header,int val){
        //header == NULL时,相当于链表不存在
        if (header == NULL)
        {
            /* code */
            return;
        }

        //创建两个辅助指针变量
        struct LinkList *pPrev = header;
        struct LinkList *pCurrent = pPrev->next;
        while (pCurrent !=NULL)
        {
            /* code */
            //true表示是在链表中找到了data为val的那个节点
            //false表示在链表中没有找到data为val的那个节点
            if (pCurrent->data == val)
            {
                /* code */
                break;
            }
            
            //移动两个辅助变量指针
            pPrev = pCurrent;
            pCurrent = pCurrent->next;
 
        }
        //没有在列表找到值为val的节点
        if (pCurrent == NULL)
        {
            /* code */
            return;
        }
        
        //重新建立删除节点的前驱与后继节点之间的关系
        pPrev->next = pCurrent->next;
        //释放节点内存
        free(pCurrent);
        // ??????????
        
        pCurrent = NULL;
        
    }

    //销毁链表
    void Destroy_LinkList(struct LinkList *header){

        if (header == NULL)
        {
            /* code */
            return;
        }
        
        //创建辅助指针变量
        struct LinkList *pCurrent = header;
        while (pCurrent != NULL)
        {
            /* code */
            //先创建一个辅助指针变量  保存当前节点的下一个节点的地址
            struct LinkList *pNext = pCurrent->next;

            //释放当前节点内存
            free(pCurrent);

            //移动辅助变量的指针向后移动,到下一个节点
            pCurrent = pNext;

        }
        

    }



    int main(){
        //创建节点,并形成链表.
        struct LinkList *header = Init_LinkList();    
        printf("-------------");
        //遍历链表
        Foreach_LinkList(header);
        printf("*************");
        //在链表中插入数据
        InsertByValue_LinkList(header,20,100);
        printf("*************");
        //插入之后再遍历一次
        Foreach_LinkList(header);
        //清空链表*********
        Clear_LinkList(header);
        //清空之后在遍历一遍
        Foreach_LinkList(header);
        //删除节点值为val的节点
        RemoveByValue_LinkList(header,2);
        //删除之后在遍历一遍
        printf("删除之后,遍历之前");
        Foreach_LinkList(header);
        printf("删除之后,遍历之后");
        //销毁链表
        Destroy_LinkList(header);
        Foreach_LinkList(header);
        return 0;


    }


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值