数据结构-(3)--链表表--代码实现

注:offset为插入,修改,更新的位置

  • main.c

#include<stdio.h>
#include"list.h"

int main(){
//定义一个空指针接收创建的表地址
LIST * pList = NULL;

//定义状态变量接收函数返回参数与SUCCESS做比

int status;

//定义整型变量接收被删除的数据
int deleteData;

//创建链表      
pList = createList();

//插入链表      
insertDataToList(pList,5,HEAD);

//插入链表
insertDataToList(pList,3,HEAD);

//插入链表
insertDataToList(pList,1,HEAD);

//插入链表
insertDataToList(pList,4,3);

//插入数据
insertDataToList(pList,6,TAIL);

//插入数据
insertDataToList(pList,2,2);

//显示数据
show(pList);
printf("----------------------插入完成\n");
//删除数据

//显示数据      
show(pList);
printf("----------------------删除完成\n");
//修改链表

update(pList,666,5);

//显示数据      
show(pList);
printf("----------------------修改完成\n");

//清空链表
//clear(pList);

//显示数据
show(pList);
printf("----------------------清空完成\n");
//销毁链表
destroyList(&pList);

//显示数据
show(pList);
printf("----------------------销毁完成\n");
}

  • list.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "list.h"

//创建链表
LIST * createList(){
        LIST * pList = (LIST *)malloc(sizeof(LIST));
        if(NULL == pList){
                printf("空间申请失败\n");
        }
        memset(pList,0,sizeof(LIST));
        printf("空间申请成功\n");
        return pList;
}

//插入链表
int insertDataToList(LIST * pList,int data,int offset){
        //判断参数
        if(NULL == pList){
                printf("链表不存在\n");
                return ERROR;
        }

        //定义新链节,并且申请堆空间和和初始化
        LIST * pNew = (LIST *)malloc(sizeof(LIST));
        if(NULL != pNew){
                memset(pNew,0,sizeof(LIST));
        }else{
                printf("新链节创建失败\n");
                return ERROR;
        }

        //判断插入位置
        //头插
        if(HEAD == offset){
                pNew->pNext = pList->pNext;
                pNew->data = data;
                pList->pNext = pNew;

               printf("数据头插成功,插入数据是:%d\n",pNew->data);
                return SUCCESS;
        //尾插
        }else if(TAIL == offset){
                LIST * p = pList;
                while(NULL != p->pNext){
                        p = p->pNext;
                }
                p->pNext = pNew;
                pNew->data = data;
                printf("数据尾插成功,插入数据是:%d\n",pNew->data);
                return SUCCESS;
        //中间插
        }else{
                LIST * p = pList;
                int i;
                for(i = 0;i < offset - 1;i++){
                        p = p->pNext;
                }
                pNew->pNext = p->pNext;
                pNew->data = data;
                p->pNext = pNew;
                printf("数据中插成功,插入数据是:%d\n",pNew->data);
                return SUCCESS;
        }
}

//显示数据
int show(LIST * pList){
        //判断参数
        if(NULL == pList){
                printf("链表不存在\n");
                return ERROR;
        }
        LIST * p = pList;
        while(NULL != p->pNext){
                printf("节点数据是:%d\n",p->pNext->data);
                p = p->pNext;
        }

}

//删除链表
int deleteDataFromList(LIST * pList,int * deleteData,int offset){
        //判断参数
        if(NULL == pList){
                printf("链表不存在\n");
                return ERROR;
        }

        //删除节点的上一节点
        LIST * p =pList;
        //要删除的节点
        LIST * pDel = NULL;
        //遍历链表找到要删除的节点
        int i;
        for(i = 0;i < offset - 1;i++){
                p = p->pNext;
                if(NULL == p->pNext){
                        printf("链表越界\n");
                        return ERROR;
                }
        }
        //重新连接链表,取出被删除的值
        pDel = p->pNext;
        p->pNext = pDel->pNext;
        * deleteData = pDel->data;
        printf("删除的数据是:%d\n",pDel->data);
        free(pDel);
        pDel = NULL;
        return SUCCESS;
}

//修改链表
int update(LIST * pList,int data,int offset){
        //判断参数
        if(NULL == pList){
                printf("链表不存在\n");
        }

        LIST * p = pList;
        int i;
        for(i = 0;i < offset;i++){
                p = p->pNext;
                if(NULL == p){
                        printf("链表越界\n");
                        return ERROR;
                }
        }
        p->data = data;
        printf("修改的数据是:%d\n",data);
        return SUCCESS;
}

//清空链表
int clear(LIST * pList){
        //判断参数
        if(NULL == pList){
                printf("链表不存在\n");
                return ERROR;
        }
        //遍历链表并free节点
        int i = 0;
        LIST * p = pList->pNext;
        while(NULL != p){
                pList->pNext = p->pNext;
                free(p);
                p = pList->pNext;
                //对释放的节点进行计数,验证清空是否正确
                i++;
                printf("第%d",i);
                printf("个节点释放成功\n");
        }
        pList->pNext = NULL;
        printf("头节点pNext清空成功\n");
        return SUCCESS;
}

//销毁链表
int destroyList(LIST ** pList){
        //判断参数
        if(NULL == *pList){
                printf("链表不存在\n");
                return ERROR;
        }
        clear(*pList);
        free(*pList);
        *pList = NULL;
        printf("链表销毁成功\n");
        return SUCCESS;
}

  • list.h

#ifndef _LIST_H_
#define _LIST_H_

//定义全局常量
enum e_flag{
        TAIL = -1,
        HEAD = 0,

        ERROR = -1,
        SUCCESS = 0,
};

//创建链表节点
struct s_list{
        int data;
        struct s_list * pNext;
};
typedef struct s_list LIST;

//创建链表
LIST * createList();

//插入数据
int  insertDataToList(LIST * pList,int data,int offset);

//显示数据
int show(LIST * pList);

//删除数据
int deleteDataFromList(LIST * pList,int * deleteData,int offset);

//修改链表
int update(LIST * pList,int data,int offset);

//清空链表
int clear(LIST * pList);

//销毁链表

int destroyList(LIST ** pList);

#endif

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值