c语言有头循环单链表
来源:互联网 发布:ubuntu chroot 编辑:程序博客网 时间:2024/06/07 13:30
/************************************************************************* > File Name: singleLineTable.c > Author: zshh0604 > Mail: zshh0604@.com > Created Time: 2014年10月15日 星期三 11时34分08秒 ************************************************************************/#include<stdio.h>#include<stdlib.h>#include<string.h>/*** * 循环单链表。 * * 学生结构体: *id: 学生编号 *name:学生姓名 *math:分数 *next:指向下一个学生结构体 */typedef struct student {int id; char name[20];int math;struct student * next;}stu;typedef int cmp_stu(const void * ,const void *);/**** * 函数功能: *创建一个头节点。 *函数参数: *void. *函数的返回值: *返回头节点指针。 */stu * create(void){stu *head = NULL;stu *p = NULL;stu *new = NULL;int tmpId = 0 ;char tmpName[20];int tmpMath;head =(stu*) malloc(sizeof(stu));if(head == NULL){printf("分配stu地址空间失败!!!\n");return NULL;}head->id = 0;strncpy(head->name,"\0");head->math = 0;//head->next = NULL; //单链表head->next = head; //有头循环单链表p = head; //当头创建出来之后应该将指针指向该头部。while(1){new = (stu*) malloc(sizeof(stu));if(new==NULL){printf("malloc new error\n");return NULL;}tmpId++;if(tmpId == 3){break;}new->id = tmpId;printf("\nname=");scanf("%s",tmpName);strncpy(new->name,tmpName,20);printf("math=");scanf("%d",&tmpMath);new->math = tmpMath;p->next = new; p = new;//new ->next = NULL; //单链表new->next = head; //有头循环单链表}return head;}/*** * 函数功能: *打印输出单链表中的数据。 *函数参数: *head 是链表的头。 *返回值: *没有返回值 */void printf_list(stu *head){stu *tmp = NULL;int i = 0;if(head== NULL){return;}tmp = head->next;#if1 //有头循环单链表 while(tmp!=head){i++;printf("name = %s\n",tmp->name);printf("math = %d\n",tmp->math);tmp = tmp->next;}#elsewhile(tmp!=NULL) //单链表{i++;printf("name = %s\n",tmp->name);printf("math = %d\n",tmp->math);tmp = tmp->next;#endifprintf("len = %d\n",i);}/***** * 函数功能: *比较函数。 * 函数参数: * * 函数返回值: *返回0表示成功。 * 返回1表示失败? * */int cmp(const void * data, const void * key){stu * head = NULL;int * tmpkey =NULL;head = (stu*) data;tmpkey=(int*)key;//printf("head->id = %d, tmpkey = %d",((stu*)data)->id, *tmpkey);if(head->id == *tmpkey){return 0;}return 1;}/**** * *函数功能: *查找一个节点中的数据。 *函数参数: * *函数返回值: *返回0查找成功,返回1查找失败。 */void * find_stu(stu* head,cmp_stu* cmps, const void *key){stu * tmp = NULL;tmp = head->next;if(key == NULL){return NULL;}#if 1 //循环单链表if(cmps((const void *)head, (const void *)key) == 0){printf("name = %s\n",tmp->name);printf("math = %d\n",tmp->math);return tmp;}while(tmp != head){if (cmps((const void *) tmp,(const void * )key)==0){printf("name = %s\n",tmp->name);printf("math = %d\n",tmp->math);return tmp;}tmp = tmp->next;}#else //单链表while(tmp != NULL){if (cmps((const void *) tmp,(const void * )key)==0){printf("name = %s\n",tmp->name);printf("math = %d\n",tmp->math);return tmp;}tmp = tmp->next;#endifreturn NULL;}/*** * 函数功能: *插入节点。 *函数参数: * head:链表中的节点。 * new:需要插入的节点。 *函数的返回值: *返回0表示插入成功。 *返回1表示插入失败。 */int insert_tool(stu* head, stu* new){if(head==NULL||new == NULL){return 1;}#if 1 //循环单链表 if(head->next == head){head->next = new;new->next = head;}#else //单链表if(head->next == NULL){head->next = new;new->next = NULL;}#endifnew->next = head->next;head->next = new;return 0;}/*** *函数功能: * 根据名称进行比较。 *函数参数: * data数据,key为要查数据中查找的值。 *函数的返回值: * 返回0成功。返回1失败。 */int cmp_name(const void *data, const void *key){stu *tmp = NULL;char *tmpName = NULL;if(data== NULL || key == NULL){return 1;}tmp =(stu *) data;tmpName =(char *) key;if(strncmp(tmp->name,tmpName, 20)==0){return 0;}return 1;}/*** * *函数功能: *插入一个节点到链表中。 *函数参数: *head:链表的头节点。 *name :要查看的节点的名称。 *函数返回值: *返回0插入成功。 *返回1插入失败。 */int insert_stu(stu* head,char *name){stu * tmp = NULL;stu * new = NULL;char tmpName[20];int tmpMath;tmp = (stu *)find_stu(head,cmp_name,name);if(tmp == NULL){printf("没有找到该同学\n");return 1;}new = (stu*) malloc(sizeof(stu));printf("name=");scanf("%s",tmpName);strncpy(new->name,tmpName,20);printf("math=");scanf("%d", &tmpMath);new->math = tmpMath;new->id = 10;insert_tool(tmp,new);return 0;}/** *函数功能: *删除制定的节点。 *参数: * head:链表的头 * name:要删除学生的名字。 *返回值。 * 0 返回成功。1返回失败。 */int delete_stu(stu * head,char *name){stu * back = NULL;stu * p = NULL;p = head->next; #if 1 //循环单链表 if(strcmp(p->name,name)==0){head->next = p->next;p->next = NULL;free(p);return 0;}while(p != head){back = p; p = p->next; if(strcmp(p->name,name) == 0){back->next = p->next;p->next = NULL;free(p);return 0;}}#else //单链表while(p!=NULL){back = p; p = p->next; if(strcmp(p->name,name) == 0){back->next = p->next;p->next = NULL;free(p);return 0;}#endifreturn 1;}/*** * 函数功能: *销毁链表。 * 函数的参数: *链表的头。 *函数的返回值 *0表示返回成功。1表示返回失败。 */int destory_list(stu* head){stu *tmp;stu *p;p = head->next;while(p!=head){ tmp = p; p = p->next;tmp->next = NULL;printf("name = %s", tmp->name);free(tmp);}}int main(void){int i = 2;stu * head = NULL;head = create();printf_list(head);find_stu(head,cmp,&i);insert_stu(head,"bb");printf_list(head);printf("----------------------\n");destory_list(head);head = NULL;printf_list(head);printf("---------------------\n");}
1 0
- c语言有头循环单链表
- c语言之————有头循环单链表
- c语言之————有头循环单链表改进版
- c语言之————有头循环双链表(公用par)
- c语言之————有头循环双链表实现栈存储
- c语言之————有头循环双链表实现队列存储
- 头结点循环链表 C语言
- c语言循环单链表
- C语言-----循环单链表
- C语言 头指针单链表
- C语言有头结点链表的经典实现
- C语言 头文件 相对路径 (有局限性)
- 在C语言头文件中“”与<>有什么区别?
- 在C语言头文件中“”与<>有什么区别?
- c语言实现循环单链表
- 【C语言数据结构】循环单链表
- C语言中的头文件有多少种都有哪些?C函数库有哪些?
- C语言 循环语言
- HDU 4770 Lights Against Dudely
- 【LeetCode】Permutations 解题报告
- OGEngine教程: 图片资源加载及工具使用
- Cocos2d-x Lua 使用Cocos Studio导出的动画
- ping 原理与ICMP协议
- c语言有头循环单链表
- 第8周项目3(1)-分段函数计算
- 2014十月——随笔。
- 程序设计中的函数(方法)的生命周期
- size balanced tree
- 支持向量机SVM(二)
- C:\Users\Administrator\Desktop\频道录音\子涵打造.mp3\
- CocoaPods安装和使用教程
- 实现self.view的整体上移