链表 实例代码

来源:互联网 发布:正见 佛陀的证悟 知乎 编辑:程序博客网 时间:2024/06/03 23:27
#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct node{    char id[20];    char name[20];    int age;    struct node *next;} NODE, *LINK;LINK head = NULL;LINK n = NULL;int AddNode(LINK);void ShowNode(void);int DeleteNode(LINK);int PrintLine(int);int AddLine(LINK,int);int DeleteLine(int);void Free(void);int AddNode(LINK add){    LINK pre;    LINK cur;    pre = head;    cur = head->next;    if (head->next == NULL)    {        head->next = add;        return(0);    }    else    {        while (cur != NULL)        {            if (strcmp(add->id, cur->id) <= 0)                break;            else {                pre = cur;                cur = cur->next;            }        }        pre->next = add;        add->next = cur;        return(0);    }}int AddLine(LINK add, int index){    LINK pre;    LINK cur;    pre = head;    cur = head->next;    while(index!=1 && cur!=NULL)    {        pre = cur;        cur = cur->next;        index-=1;    }    if (cur==NULL,index!=1)    {        printf("Did not find the correct intex to add\n");        return(1);    }    else{        pre->next = add;        add->next = cur;        return(0);    }}int DeleteNode(LINK delete){    LINK pre;    LINK cur;    pre = head;    cur =head->next;    if (head->next == NULL)    {        printf("Did not find to delete\n");        return(1);    }    else    {        while(cur!=NULL)        {            if (strcmp(delete->id, cur->id) == 0)                break;            else {                pre = cur;                cur = cur->next;            }        }        if (cur==NULL)        {            printf("Did not find to delete\n");            return(1);        }        else{            pre->next = cur->next;            free(cur);            cur = NULL;            free(delete);            delete = NULL;            return(0);        }    }}int DeleteLine(int index){    LINK pre;    LINK cur;    pre = head;    cur = head->next;    while(index!=1 && cur!=NULL)    {        pre= cur;        cur = cur->next;        index-=1;    }    if (index!=1 && cur==NULL)    {        printf("Did not find correct index to delete\n");        return(1);    }    else    {        pre->next = cur->next;        free(cur);        cur = NULL;        return(0);    }}int PrintLine(int index){    LINK cur;    cur = head->next;    while(index!=1 && cur!= NULL)    {        cur = cur->next;        index -=1;    }    if (cur==NULL)    {        printf("Did not find to print\n");        return(1);    }    else    {        printf("%-10s: %-10s: %3d\n", cur->id, cur->name, cur->age);        return(0);    }}void ShowNode(void){    LINK p;    if (head != NULL) {        p = head->next;        while (p)        {            printf("%-10s: %-10s: %3d\n", p->id, p->name, p->age);            p = p->next;        }    }    else        printf("Empty!");}void Free(void){    LINK cur;    cur = head->next;    while(cur!=NULL){        head = cur->next;        free(cur);        cur=head;    }    free(cur);    cur=NULL;    free(head);    head=NULL;}int main(int argc, char const *argv[]){    FILE *file;    char buffer[128];    char *temp;    char op;    int index;    head = (LINK)malloc(sizeof(NODE));        head->next = NULL;        if (argc != 2)    {        fprintf(stderr, "error\n");        exit(EXIT_FAILURE);    }    file = fopen(argv[1], "rt");    // file = fopen("Lab1test.DAT", "rt");    if (file == NULL)    {        fprintf(stderr, "Cannot open/find %s\n", "Lab1test.DAT");        getchar();        exit(EXIT_FAILURE);    }    while (!feof(file))    {        if (fgets(buffer, 127, file) == NULL)            break;        buffer[strlen(buffer) - 1] = '\0';        n = (LINK)malloc(sizeof(NODE));        temp = strtok(buffer, ",");        strcpy(n->id, temp);        temp = strtok(NULL, ",");        strcpy(n->name, temp);        temp = strtok(NULL, ",");        n->age = atoi(temp);        n->next = NULL;        if (AddNode(n) != 0)        {            fprintf(stderr, "Error adding node. Aborting\n");            getchar();            exit(EXIT_FAILURE);        }    }    ShowNode();    while(1)    {        printf("you can input: P D I S or Q \n");        scanf("%s",&buffer);        /**/        buffer[strlen(buffer)] = '\0';        op = buffer[0];        if (op == 'P')        {            index =atoi( &buffer[1]);            if(PrintLine(index)!=0)                printf("please input again...\n");        }        else if (op== 'D')        {            index = atoi(&buffer[1]);            if (DeleteLine(index)!=0)                printf("please input again...\n");        }        else if (op == 'I')        {            n = (LINK)malloc(sizeof(NODE));            strtok(buffer, ",");            index = atoi(&buffer[1]);            temp = strtok(NULL,",");            strcpy(n->id, temp);            temp = strtok(NULL, ",");            strcpy(n->name, temp);            temp = strtok(NULL, ",");            n->age = atoi(temp);            n->next = NULL;            if(AddLine(n,index)!=0)                printf("please input again...\n");        }        else if (op=='Q')            break;        else if (op=='S')            ShowNode();        else            printf("please input the correct operation\n");    }    ShowNode();    getchar();    printf("starting to free NODE... \n");    Free();    printf("show the LINK: ");    ShowNode();    getchar();return 0;}