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; 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; } return head; } /*** * 函数功能: * 打印输出单链表中的数据。

    * 函数參数: * head 是链表的头。

    * 返回值: * 没有返回值 */ void printf_list(stu *head) { stu *tmp = NULL; int i = 0; if(head== NULL) { return; } tmp = head; while(tmp!=NULL) { i++; printf("name = %s ",tmp->name); printf("math = %d ",tmp->math); tmp = tmp->next; } 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; if(key == NULL) { return NULL; } 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; } return NULL; } /*** * 函数功能: * 插入节点。

    * 函数參数: * head:链表中的节点。

    * new:须要插入的节点。 * 函数的返回值: * 返回0表示插入成功。 * 返回1表示插入失败。 */ int insert_tool(stu* head, stu* new) { if(head==NULL||new == NULL) { return 1; } if(head->next == NULL) { head->next = new; new->next = NULL; } 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; 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; } } return 1; } /*** * 函数功能: * 销毁链表。 * 函数的參数: * 链表的头。

    * 函数的返回值 * 0表示返回成功。

    1表示返回失败。 */ int destory_list(stu* head) { stu *tmp; stu *p; p = head; while(p!=NULL) { 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("--------------------- "); }



  • 相关阅读:
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
    Learn Prolog Now 翻译
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/6784577.html
Copyright © 2011-2022 走看看