注: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