list.h(链表头文件,原创)---希望大家测试一下,找出bug

//本头文件采用中英文两种语言注释,意在大家都能看懂 //This head file consists of the two language of Chinese and English

/********************************************************************** ** **--------------------------file infomation---------------------------- **file name:list.h ** **last modified date: ** **descriptioin:对于链表的各种操作------any operation of the list ** **created by:Ethan Wei ***********************************************************************/

/********************************************************************** 头文件------head file **********************************************************************/ #include <stdio.h> #include <stdlib.h> /********************************************************************** 宏定义------macro definition **********************************************************************/ #define Type int //链表元素类型 #define ROW 10 //打印链表是一行的个数

/************************************************************************* 结构体的定义-----------struct definition *************************************************************************/

typedef struct list //单链表数据结构------single list struct { Type data; //链表中的数据 struct list *next; //下一个指针 }_SList;

typedef struct ulist //最后定义时的单链表数据结构 { _SList *head; //头节点 _SList *last; //链表的尾指针 int length; //链表的长度 }SList;

/************************************************************************* 函数定义--------function definition *************************************************************************/

/************************************************************************* 函数名称:InitList 函数表述: 对单链表进行初始化 输入值: SList * 返回值: 初始化成功返回0,否则退出 *************************************************************************/

int InitList(SList *list) { list->length = 0; //初始化长度为0

list->head = (_SList *)malloc(sizeof(_SList));

if(list->head == NULL) { fprintf(stderr,"内存不足,申请头结点空间失败"); getchar(); exit(1); } list->head->next = NULL; //链表的尾指针置空 list->last = list->head; //尾指针指向头指针 return 0; }

/************************************************************************* 函数名称:create 函数表述: 申请一个动态的链表空间 输入值: 返回值: 申请成功返回空间首地址,否则返回NULL *************************************************************************/ _SList* create() { _SList *newList;

newList = (_SList*)malloc(sizeof(_SList));

if(newList == NULL) { fprintf(stderr,"申请新空间失败------addtoHead"); return NULL; }

return newList; } /************************************************************************* 函数名称:findtoPosition 函数表述: 根据位置找到链表的元素 输入值: SList *,int position 返回值: 查找成功返回地址,否则返回NULL *************************************************************************/ _SList *findtoPosition(SList* list,int position) { _SList *curList; int i;

if(position <= 0 ||position >list->length) { puts("查找位置不合法"); return NULL; } curList = list->head->next; //指向第一个元素

for(i = 1;i < position; i++) { curList = curList->next; }

return curList; } /************************************************************************* 函数名称:findtoData 函数表述: 根据元素找到位置 输入值: SList *,Type data 返回值: 查找成功打印信息,返回0 *************************************************************************/ int findtoData(SList* list,Type data) { _SList *curList; int i;

curList = list->head->next; //指向第一个元素 if(curList == NULL) { puts("链表为空"); return 1; } for(i = 1;i <= list->length;i ++) { if(curList->data == data) { printf("位置:%d 查找元素:%d\n",i,data); } curList = curList->next; }

return 0; } /************************************************************************* 函数名称:InsertList 函数表述: 插入链表 输入值: SList *,int position,Type data 返回值: 插入成功返回0,否则返回1 *************************************************************************/ int InsertList(SList *list,int position,Type data) { int i ; _SList *curNode; _SList *newNode;

curNode = list->head; //设置当前节点为头节点,往后遍历

if(position > list->length+1 || position <= 0) { printf("插入位置不合法"); return 1; }

for(i = 1; i < position; i++) { curNode = curNode->next; } //循环结束,得到要插入的位置前一个节点 newNode = create();

newNode->data = data;

if(curNode->next != NULL) { newNode->next = curNode->next; curNode->next = newNode; //将节点链接上 } else if(curNode->next == NULL) { curNode->next = newNode; newNode->next = NULL; list->last = newNode; //更新尾部节点 } list->length += 1; //更新链表长度 return 0; } /************************************************************************* 函数名称:deltoPosition 函数表述: 删除链表,根据位置 输入值: SList *,int position 返回值: 删除成功返回0,否则返回1 *************************************************************************/ int deltoPosition(SList *list,int position) { _SList *curNode; //当前节点指针 _SList *delNode; //要删除的节点指针 int i;

if(position > list->length || position <= 0) { printf("删除位置不合法\n"); return 1; }

curNode = list->head;

for(i = 1;i < position;i ++) { curNode = curNode->next; } //此时得到的节点是要删除节点的前面一个节点 delNode = curNode->next; //此时delNode 就是要删除的节点

if(delNode->next == NULL) //即删除最后一个节点 { curNode->next = NULL; free(delNode); list->last = curNode; //更新最后一个节点 list->length -= 1; //更新链表长度 } else { curNode->next = delNode->next; free(delNode); list->length -= 1; //更新链表长度 }

return 0; } /************************************************************************* 函数名称:deltoData 函数表述: 删除链表,根据元素 输入值: SList *,Type data 返回值: 删除成功返回0,否则返回1 *************************************************************************/ int deltoData(SList *list,Type data) { _SList *curList; _SList *delList;

int delFlag = 0; //是否删除成功

curList = list->head; //指向第一个元素 if(curList->next == NULL) { puts("链表为空"); return 1; } while(curList->next != NULL) { if(curList->next->data == data) { delList = curList->next; if(delList->next == NULL) //如果删除的节点为最后一个节点 { free(delList); curList->next = NULL; list->length -= 1; //更新链表长度 list->last = curList; //更新尾部节点 delFlag += 1; break; } else { curList->next = delList->next;

free(delList); list->length -= 1; //更新链表长度

delFlag += 1; //记录删除次数 } } curList = curList->next; }

if(delFlag != 0) { printf("删除成功,共删除%d个元素,删除元素为%d\n",delFlag,data); } return 0; } /************************************************************************* 函数名称:addtoHead 函数表述: 头插入节点 输入值: SList *list,Type data 返回值: 插入成功返回0,否则返回1 *************************************************************************/ int addtoHead(SList *list,Type data) { static char lastFlag = 0; //是否更新尾部节点的标记 _SList *newList;

newList = create();

newList->data = data;

newList->next = list->head->next; list->head->next = newList;

list->length += 1; //更新长度

if(list->head->next != NULL) { lastFlag = 1; //第一次插入不是头插法 }

if(lastFlag == 0) { list->last = newList; //更新末尾节点 lastFlag = 1; } return 0; }

/************************************************************************* 函数名称:addtoTail 函数表述: 尾插入节点 输入值: SList *list,Type data 返回值: 插入成功返回0,否则返回1 *************************************************************************/ int addtoTail(SList *list,Type data) { _SList *newList;

newList = create();

newList->data = data;

list->last->next = newList; newList->next = NULL;

list->length += 1; //更新长度

list->last = newList; //更新末尾节点

return 0; } /************************************************************************* 函数名称:Traversal 函数表述: 遍历链表 输入值: SList *list 返回值: *************************************************************************/ void Traversal(SList *list) { _SList *curList; int i = 0;

curList = list->head;

printf("链表长度:%d\n",list->length); printf("链表内容如下:");

for(i = 0;i < list->length;i++) { if(i % ROW == 0) { puts(""); } printf("%d ",curList->next->data);

curList = curList->next; } puts(""); } /************************************************************************* 函数名称:destroyList 函数表述: 销毁链表 输入值: SList * 返回值: 删除成功返回0,否则返回1 *************************************************************************/ int destroyList(SList *list) { int nResult; while(list->head->next != NULL) { nResult = deltoPosition(list,1); }

return nResult; }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值