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 = tmpId; printf("name ="); scanf("%s",tmpName); strncpy(head->name,tmpName,20); printf("math ="); scanf("%d",&tmpMath); head->math = tmpMath; // 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 //循环单链表 printf("name = %s ",head->name); printf("math = %d ",head->math); 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; #if 1 //循环单链表 while(p!=head) { back = p; p = p->next; if(strcmp(p->name,name) == 0) { back->next = p->next; p->next = head; 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("--------------------- "); }


  • 相关阅读:
    O365(世纪互联)SharePoint 之调查列表简单介绍
    O365(世纪互联)SharePoint 之使用列表库发布新闻
    O365(世纪互联)SharePoint 之使用Designer报错
    SharePoint 2016 配置向导报错
    sharePoint 2016 弃用和删除的功能
    O365(世纪互联)SharePoint 之站点个性化
    数据分析与数据挖掘概述
    scrapy框架系列 (5) Spider类
    scrapy框架系列 (4) Scrapy Shell
    scrapy框架系列 (3) Item Pipline
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6748782.html
Copyright © 2011-2022 走看看