zoukankan      html  css  js  c++  java
  • 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地址空间失败!。。 "); return NULL; } head->id = 0; strncpy(head->name,""); 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 "); return NULL; } tmpId++; if(tmpId == 3) { break; } new->id = tmpId; printf(" name="); 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 ",tmp->name); printf("math = %d ",tmp->math); tmp = tmp->next; } #else while(tmp!=NULL) //单链表 { i++; printf("name = %s ",tmp->name); printf("math = %d ",tmp->math); tmp = tmp->next; #endif printf("len = %d ",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 ",tmp->name); printf("math = %d ",tmp->math); return tmp; } while(tmp != head) { if (cmps((const void *) tmp,(const void * )key)==0) { printf("name = %s ",tmp->name); printf("math = %d ",tmp->math); return tmp; } tmp = tmp->next; } #else //单链表 while(tmp != NULL) { if (cmps((const void *) tmp,(const void * )key)==0) { printf("name = %s ",tmp->name); printf("math = %d ",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== 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("没有找到该同学 "); 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; } #endif return 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("---------------------- "); destory_list(head); head = NULL; printf_list(head); printf("--------------------- "); }


  • 相关阅读:
    springmvc log4j 配置
    intellij idea maven springmvc 环境搭建
    spring,property not found on type
    intellij idea maven 工程生成可执行的jar
    device eth0 does not seem to be present, delaying initialization
    macos ssh host配置及免密登陆
    centos7 搭建 docker 环境
    通过rest接口获取自增id (twitter snowflake算法)
    微信小程序开发体验
    gitbook 制作 beego 参考手册
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/7150029.html
Copyright © 2011-2022 走看看