• C语言实现链表


    C语言实现链表 - c语言程序开发技术文章 - 红黑联盟
    http://www.2cto.com/kf/201109/104029.html

    C代码 
    /* 
     * @author: lizhenbin
     * @date: 2011-09-14
     * @descrption: list operation
     */ 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <conio.h> 
    #define NULL 0 
     
    /* define a link node strut */ 
    struct student  
    { 
        long num; 
        struct student *prior; /* define point to the struct */ 
        struct student *next; 
    }; 
     
    /* create struct */ 
    struct student *create() 
    { 
        struct student *head; /* link head and node point */ 
        struct student *p; 
        struct student *q; 
        long x; 
     
        head = (struct student*)malloc(sizeof(struct student)); 
        q = head; 
        head->next = NULL; 
        printf("\nPlease input node numbers to the list: \n"); 
        scanf("%ld",&x); 
        while(x!=0)  
        { 
            /* create node */ 
            p = (struct student*)malloc(sizeof(struct student)); 
            p->num = x; 
            p->next = NULL; 
            q->next = p; 
            p->prior = q; 
            q = p; 
            scanf("%ld",&x); 
        } 
        return head; 
    } 
     
    /* Output list all datas */ 
    void print(struct student *head) 
    { 
        struct student *p; 
        p = head->next; 
        printf("\nThe list is: "); 
        if(p==NULL)  
        { 
            printf("\nInput list is NULL!"); 
        } 
        while(p!=NULL)  
        { 
            printf("%ld ", p->num); 
            p = p->next; 
        } 
        printf("\n"); 
    } 
     
    /* delete list node */ 
    void del(struct student *head) 
    { 
        struct student *p; 
        struct student *q; 
        int i; 
        int j=0; 
     
        printf("Please input delete position: "); 
        scanf("%d", &i); 
        if(i<1)  
        { 
            printf("You input %d error.", i); 
            printf("\nTry again, Input nnum: "); 
            scanf("%d", &i); 
        } 
        p = head; 
        while(j<=i-1 && p!=NULL)  
        { 
            p = p->next; 
            j++; 
        } 
        if(p==NULL) 
        { 
            printf("\nThere is no %d in the list.", i); 
            exit(1); 
        } 
        else 
        { 
            /* delete list node */ 
            q = p; 
            p->prior->next = p->next; 
            p->next->prior = p->prior; 
            p = p->next; 
            free(q); 
        } 
    } 
     
    /* insert list node */ 
    void insert(struct student *head) 
    { 
        struct student *p; 
        struct student *q = head; 
        int i; 
        int j = 0; 
         
        p = (struct student*)malloc(sizeof(struct student)); 
        printf("\nPlease input the student No you want to insert: "); 
        scanf("%ld", &p->num); 
        printf("\nInput the student %d position to insert: ",p->num); 
        scanf("%d", &i); 
        if(i<1)  
        { 
            printf("\nYou input %d error.", i); 
            printf("\nTry again, Input nnum: "); 
            scanf("%d", &i); 
        } 
        while(j<=i-1 && q->next!=NULL)  
        { 
            q = q->next; 
            j++; 
        } 
        if(q->next==NULL && j!=i) 
        { 
            p->next = NULL; 
            p->prior = q; 
            q->next = p; 
        } 
        else 
        { 
            q->prior->next = p; 
            p->prior = q->prior; 
            p->next = q; 
            q->prior = q; 
        } 
    } 
     
    /* search list node position and data */ 
    void search(struct student *head) 
    { 
        struct student *p; 
        long number, i=1, j=0; 
     
        printf("\nPlease input the index you want to search: "); 
        scanf("%d", &number); 
        p = head->next; 
        printf("\nThe number in the list position is: "); 
     
        while(p!=NULL) 
        { 
            if(p->num==number) 
            { 
                printf("%d\n",i); 
                j = 1; 
            } 
            p = p->next; 
            i++; 
        } 
        if(j==0)  
        { 
            printf("There is no %ld in the list.\n",number); 
        } 
    } 
     
    /* read data from file input */ 
    struct student *filein()  
    { 
        struct student *p1; 
        struct student *p2; 
        struct student *head; 
        int i = 0; 
        FILE *fp; 
     
        char file[20] = "d:/list/node.txt"; 
        printf("\nFileName is: %s\n", file); 
        if((fp=fopen(file, "r"))==NULL) 
        { 
            printf("Can not open file: %s", file); 
            exit(0); 
        } 
        p2 = (struct student*)malloc(sizeof(*p1)); 
        head = p2; 
        p1 = (struct student*)malloc(sizeof(*p1)); 
        while(fread(p1, sizeof(*p1), 1, fp)==1) 
        { 
            i++; 
            p2->next = p1; 
            p2 = p1; 
            p1->next = NULL; 
            p1 = (struct student*)malloc(sizeof(*p1)); 
        } 
        free(p1); 
        fclose(fp); 
        if(i==0) 
        { 
            printf("\nNo recored in %s ", file); 
        } 
        return head; 
    } 
     
    /* save the list result to file */ 
    void savefile(struct student* head) 
    { 
        struct student *p1; 
        FILE *fp; 
        char file[20] = "d:/list/node.txt"; 
        printf("\nFileName: %s", file); 
        printf("\nPlease wait.../n"); 
        if((fp=fopen(file,"w"))==NULL) 
        { 
            printf("\nCan not open file: %s", file); 
            exit(0); 
        } 
        p1 = head->next; 
        while(p1!=NULL) 
        { 
            fwrite(p1, sizeof(struct student), 1, fp); 
            p1 = p1->next; 
        } 
        fclose(fp); 
    } 
     
    /* print the operate menu */ 
    void showMenu() 
    { 
        printf("|-------------------------------------------------|\n"); 
        printf("|            Link List Opearte Menu               |\n"); 
        printf("|-------------------------------------------------|\n"); 
        printf("|                 1: Insert                       |\n"); 
        printf("|                 2: Delete                       |\n"); 
        printf("|                 3: Search                       |\n"); 
        printf("|                 4: FileIn                       |\n"); 
        printf("|                 5: Savefile                     |\n"); 
        printf("|                 6: Print List                   |\n"); 
        printf("|                 7: Print Menu                   |\n"); 
        printf("|                 8: Exit                         |\n"); 
        printf("|-------------------------------------------------|\n"); 
    } 
     
    /* main funtion */ 
    void main() 
    { 
        int a=0; 
        struct student *la; 
        la = create(); 
        /*
        la = (struct student*)malloc(sizeof(struct student));
        la->next = NULL;
        */ 
        while(1) 
        { 
            showMenu(); 
            scanf("\n%d", &a); 
            switch(a) 
            { 
                case 1: insert(la); break; 
                case 2: del(la); break; 
                case 3: search(la); break; 
                case 4: filein(); break; 
                case 5: savefile(la); break; 
                case 6: print(la); break; 
                case 7: showMenu(); break; 
                case 8: exit(1); 
                default: printf("\nInput error,Try again.");break;  
            } 
        } 
    }
    
    作者“萧萧易水寒”
  • 相关阅读:
    云原生 Serverless Database 使用体验
    如何画一张架构图(内含知识图谱)
    阿里云 Serverless Kubernetes 的落地实践分享
    【阿里云 CDP 公开课】 第二讲:CDH/HDP 何去何从
    阿里云数据治理系列(一):治理项目启动前的必答三问
    使用递归方法全选/反选TreeView中CheckBox子节点
    C# 安装部署项目 【转】
    HashTable存储树形数据
    Delphi中MessageBox用法【转】
    js nextSibling属性和previousSibling属性
  • 原文地址:https://www.cnblogs.com/flash610/p/3077223.html
Copyright © 2020-2023  润新知