线性表玩具之链表版本(C语言)

来源:互联网 发布:数据库置疑修复语句 编辑:程序博客网 时间:2024/05/22 00:47
2009年3月26日 12:41 Slyar 发表评论 阅读评论

文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。

本来不想发这么水的代码,可是最近也没什么好写的...纯当凑文章数目吧...

这是一个线性表操作的小玩具,此篇为链表版本,也就是用指针和动态内存分配的。

 

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
/*线性链表操作Slyar 2009.3.26http://www.slyar.com*/ #include <stdio.h>#include <stdlib.h> /* 定义链表节点类型 */typedef struct node{    int data;    struct node *next;}linklist; /* 函数声明部分 */linklist* Get(linklist*, int);linklist* CreateList();void FreeList(linklist*);void Output(linklist*);void AppendNode(linklist*, int);void InsertNode(linklist*, int, int);void ReadNode(linklist*, int);void SearchFromList(linklist*, int);void DeleteNode(linklist*, int);void UpdateNode(linklist*, int, int);void ListList(linklist*); /* 主函数 */int main(){int key,pos;    char ch;    linklist *slist;    slist = CreateList();    while(1){        Output(slist);        printf("请选择:");        ch=getchar();        fflush(stdin);        if(ch == 'a')        {            printf("请输入要追加的数据:");            scanf("%d",&key);            fflush(stdin);            AppendNode(slist,key);            Output(slist);        }        else        if(ch == 'i')        {            printf("请输入要插入的数据的位置:");            scanf("%d",&pos);            fflush(stdin);            printf("请输入要插入的数据:");            scanf("%d",&key);            fflush(stdin);            InsertNode(slist,key,pos);            Output(slist);        }        else        if(ch == 'd')        {            printf("请输入要删除的数据的位置:");            scanf("%d",&pos);            fflush(stdin);            DeleteNode(slist,pos);            Output(slist);        }        else        if(ch == 'r')        {            printf("请输入要读取的数据的位置:");            scanf("%d",&pos);            fflush(stdin);            ReadNode(slist,pos);            Output(slist);        }        else        if(ch == 'u')        {            printf("请输入要修改的数据的位置:");            scanf("%d",&pos);            fflush(stdin);            printf("请输入要修改的数据:");            scanf("%d",&key);            fflush(stdin);            UpdateNode(slist,key,pos);            Output(slist);        }        else        if(ch == 's')        {            printf("请输入要查找的数据:");            scanf("%d",&key);            fflush(stdin);            SearchFromList(slist,key);            Output(slist);        }        else        if(ch == 'e')        {            FreeList(slist);            exit(0);        }    }    system("pause");    return 0;} /* 打印说明文档 */void Output(linklist *list){    system("cls");    printf("--------------------------------------/n");    printf("-  欢迎使用线性链表                  -/n");    printf("-                                    -/n");    printf("-  用法:                             -/n");    printf("-  a: 追加一个节点                   -/n");    printf("-  i: 插入一个节点                   -/n");    printf("-  d: 删除一个节点                   -/n");    printf("-  r: 读取指定节点的值               -/n");    printf("-  u: 修改指定节点的值               -/n");    printf("-  s: 查找链表                       -/n");    printf("-  e: 退出                           -/n");    printf("--------------------------------------/n");    ListList(list);   } /* 创建线性链表 */linklist* CreateList(){    linklist *head, *r;    head = (linklist*) malloc(sizeof(linklist));    if (head == NULL)    {        printf("内存不足,无法分配!/n");        system("pause");    }    else    {        r = head;        r -> next = NULL;    }    return head;} /* 打印线性链表 */void ListList(linklist* head){    linklist *p;    p = head -> next;    printf("当前链表的状态:/n");    if(p == NULL)    {        printf("当前链表为空/n");    }    else    {        while(p != NULL)        {            printf("[%d]", p -> data);            p = p -> next;        }        printf("/n");    }} /* 读取节点 */void ReadNode(linklist* head, int pos){    int j = 0;    linklist *p;    p = head;    while((p -> next != NULL) && (j < pos))    {        p = p -> next;        j++;    }    if (pos == j)    {        printf("位置%d中的数据是:%d/n", pos, p -> data);    }    else    {        printf("所读取的位置超出链表的范围/n");    }    system("pause");} /* 查找节点 */void SearchFromList(linklist* head, int n){    int i = 0, sign = 0;    linklist *p;    p = head -> next;    while(p != NULL)    {        if(p -> data == n)        {            sign = 1;            printf("在位置[%d]处找到此数据/n", i+1);        }        i++;        p = p -> next;    }    if (!sign)    {        printf("找不到此数据!/n");    }    system("pause");} /* 追加节点 */void AppendNode(linklist* head, int n){    linklist *p, *s;    p = head;    while(p -> next != NULL)    {        p = p -> next;    }    s = (linklist*) malloc(sizeof(linklist));    if (s == NULL)    {        printf("内存不足,无法追加!/n");        system("pause");    }    else    {        s -> data = n;        s -> next = p -> next;        p -> next = s;    }} /* 得到节点位置 */linklist* Get(linklist* head, int i){    int j = 0;    linklist *p;    p = head;    while((p -> next != NULL) && (j < i))    {        p = p -> next;        j++;    }    if (i == j)    {        return p;    }    else    {        return NULL;    }} /* 插入节点 */void InsertNode(linklist* list, int n, int pos){    linklist *p, *s;    int j = pos - 1;    p = Get(list, j);    if (p == NULL)    {        printf("所插入的位置超出范围/n");        system("pause");    }    else    {        s = (linklist*) malloc(sizeof(linklist));        if (s == NULL)        {            printf("内存不足,无法插入!/n");            system("pause");        }        else        {            s -> data = n;            s -> next = p -> next;            p -> next = s;        }    }} /* 删除节点 */void DeleteNode(linklist* head, int pos){    linklist *p;    int j = pos - 1;    p = Get(head, j);    if ((p != NULL) && (p -> next != NULL))    {        linklist *r;        r = p -> next;        p -> next = r -> next;        free(r);    }    else    {        printf("所要删除的位置超出链表的范围/n");        system("pause");    }} /* 编辑节点 */void UpdateNode(linklist *head, int n, int pos){    linklist *p;    p = Get(head, pos);    if (p == NULL)    {        printf("所读取的位置超出链表的范围/n");        system("pause");    }    else    {        p -> data = n;    }} /* 释放链表 */void FreeList(linklist* p){    if (p -> next != NULL)    {        FreeList(p -> next);    }    free(p);}