最新消息:点击查看大S的省钱秘笈

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

编程相关 Slyar 2334浏览 2评论

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

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

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

/*
线性链表操作
Slyar 2009.3.26
//www.slyar.com
*/

#include 
#include 

/* 定义链表节点类型 */
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);
}

转载请注明:Slyar Home » 线性表玩具之链表版本(C语言)

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (2)

  1. 技术博客好高深
    林晨12年前 (2009-03-28)回复
  2. 确实太水了。我一个同学QQ空间里全是代码。。。
    epile12年前 (2009-03-27)回复