list.h(链表头文件,原创)---希望大家测试一下,找出bug
2010-08-06 23:24
537 查看
//本头文件采用中英文两种语言注释,意在大家都能看懂 //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; }
相关文章推荐
- 主流数据库总结分析一下,希望大家多补充问题
- 回文链表 请编写一个函数,检查链表是否为回文。 给定一个链表ListNode* pHead,请返回一个bool,代表链表是否为回文。 测试样例: {1,2,3,2,1} 返回:true {1,2,3,
- 接触的第一个加密算法 给大家参考一下 希望大家多多指教
- 请大家帮忙测试一下阿里云的带宽线路
- Linux企业级项目实践之网络爬虫(23)——系统测试:找出系统中的bug
- CSS3基础知识小测验上线,大家有兴趣可以测试一下!
- 我的论坛刚刚建立起来,希望大家能支持一下~~~
- 专知原创和整理了一些中英文机器学习从入门到精通的资料,和大家分享一下
- Linux企业级项目实践之网络爬虫(23)——系统测试:找出系统中的bug
- 个人论坛,希望大家注册一下,增加人气
- 为什么最近我不能在我自己的日志里面发表评论呢?点发表没有反应,请大家帮我测试一下看看能否发!
- 突发奇想的一个社交游戏idea,但是想法中具有不平衡因素,希望大家可以看看然后可以启发一下大家
- 呵呵。我的论坛被我弄得漂亮多了。散分!顺便请大家帮忙测试一下速度。
- 走出房间Flash高智商,建议大家试试娱乐一下 原创
- 我的网站刚建好,希望大家支持一下
- 评:我从编程中悟出八个字(不算原创,不过希望让大家能看看)
- ME525+/defy+,不能充满电的问题终于找到了解决的方法,在这里和大家分享一下!!!希望能帮助到大家!!!
- linked-list-cycle-ii——链表,找出开始循环节点
- 自己实现单向链表讨论一下LinkedList的效率
- 多天的问题终于解决了,希望大家有遇到这种问题的不要像我一样,分享一下