首页 > 代码库 > c语言有头循环单链表
c语言有头循环单链表
/************************************************************************* > 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; #if 1 //有头循环单链表 while(tmp!=head) { i++; printf("name = %s\n",tmp->name); printf("math = %d\n",tmp->math); tmp = tmp->next; } #else while(tmp!=NULL) //单链表 { i++; printf("name = %s\n",tmp->name); printf("math = %d\n",tmp->math); tmp = tmp->next; #endif printf("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; #endif return 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; } #endif new->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=http://www.mamicode.com/= NULL || key == NULL)>c语言有头循环单链表
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。