| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2251 人关注过本帖
标题:一个用C语言编写一个单链表的程序。我一运行就错误,请高手来看看有哪里出错 ...
只看楼主 加入收藏
CUIT快乐
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2015-10-11
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:4 
一个用C语言编写一个单链表的程序。我一运行就错误,请高手来看看有哪里出错了
#include<stdio.h>
#include<malloc.h>

typedef int DataType;        /*宏定义DataType的类型为整型*/
typedef struct Node{        /*宏定义单链表的结点结构*/
    DataType data;            /*data域用于存放数据元素*/
    struct Node *next;        /*next域用于存放指向其后继的指针*/
}LNode, *PNode, *LinkList;    /*LinkList为头指针*/

/*
  函数名:Menu
  函数作用:书写菜单
  入口参数:无
  出口参数:无
  函数编写人:yyk
*/
void Menu(void)
{
    printf("\t\t\t\t单链表\n");
    printf("\t***************************************************\n");
    printf("\t本程序可用于单链表的各种操作——包含初始化单链表,求表长,插入,删除,查找和销毁单链表。\n");
    printf("\t输入数字,按下回车键,即可运行对应操作,若初次运行,请先运行操作1\n");
    printf("\t\t(1)输入数组(注意应当是整数)\n");
    printf("\t\t(2)输出单链表长度\n");
    printf("\t\t(3)插入数据(输入形式为:插入位置,插入数字数值)\n");
    printf("\t\t(4)删除数据(输入形式为:删除位置)\n");
    printf("\t\t(5)查找元素(输入待查找的数据元素即可)\n");
    printf("\t\t(6)销毁单链表。\n");
    printf("\t\t(7)退出系统。\n");
    printf("**************************************************************************\n");
}

/*
  函数名:InitList
  函数作用:初始化单链表
  入口参数:LinkList *h
  出口参数:0 1
*/
int InitList(LinkList *h)
{
    *h = (LinkList)malloc(sizeof(LNode));    /*生成头结点*/
    if(!h)
    {
        printf("初始化链表错误!\n");

        return 0;
    }
    (*h)->next = NULL;

    return 1;
}

/*
  函数名:ListLength
  函数作用:求表长
  入口参数:LinkList h
  出口参数:total
*/
int ListLength(LinkList h)
{
    int total = 0;
    PNode p = h->next;

    while(p)
    {
        total++;
        p = p->next;
    }

    return total;
}

/*
  函数名:ListEmpty
  函数作用:判空表
  入口参数:LinkList h
  出口参数:0 1
*/
int ListEmpty(LinkList h)
{
    if(h->next==NULL)
    {
        return 1;
    }
    return 0;
}

/*
  函数名:ListInsert
  函数作用:插入
  入口参数:LinkList h, int pos, DataType x
  出口参数:0 1
*/
int ListInsert(LinkList h, int pos, DataType x)
{
    PNode p = h,q;
    int i = 0;

    while(p && i<pos-1)
    {
        p = p->next;
        i++;
    }
    if(!p || i>pos-1)
    {
        printf("插入位置不合法!\n");

        return 0;
    }
    q = (PNode)malloc(sizeof(LNode));
    if(!q)
    {
        printf("无法生成新结点\n");

        return 0;
    }
    q->data = x;
    q->next = p->next;
    p->next = q;

    return 1;
}

/*
  函数名:ListDelete
  函数作用:删除
  入口参数:LinkList h, int pos, DataType *item
  出口参数:0 1
*/
int ListDelete(LinkList h, int pos, DataType *item)
{
    PNode p = h,q;
    int i = 0;

    while(p->next && i<pos-1)
    {
        p = p->next;
        i++;
    }
    if(!p->next || i>pos-1)
    {
        printf("删除位置不合法!\n");

        return 0;
    }
    q = p->next;
    p->next = q->next;
    *item = q->data;
    free(q);
    return 1;
}

/*
  函数名:Find
  函数作用:查找
  入口参数:LinkList h, DataType item
  出口参数:p
*/
PNode Find(LinkList h, DataType item)
{
    int i, flag = 0;

    PNode p = h->next;
    for(i=1; p; i++)
    {
        p = p->next;
        if(p->data == item)
        {
            printf("该元素的位置是:%d", i);
            flag = 1;
            break;
        }
    }
    if(flag==0)
    {
        printf("数组中没有此元素!");
    }

    return p;
}

/*
  函数名:DestroyList
  函数作用:销毁单链表
  入口参数:LinkList h  
  出口参数:0 1
*/
void DestroyList(LinkList h)
{
    PNode p = h->next;
    while(h)
    {
        p = h;
        h = h->next;
        free(p);
    }
}

/*
  函数名:TraverseList
  函数作用:遍历单链表
  入口参数:LinkList h
  出口参数:0 1
*/
void TraverseList(LinkList h)
{
    PNode p = h->next;
    while(p)
    {
        printf("%5d", p->data);
        p = p->next;
    }
    printf("\n");
}

/*
  函数名:Work
  函数作用:识别运行指令
  入口参数:输入值
  出口参数:无
  函数编写人:yyk
*/
void Work(int choice, LNode *h)
{
    int num = 0, flag = 0, pos = 0;
    PNode tail, p;

    switch(choice)
    {
    case 1:
        flag = InitList(&h);

        if(flag==0)
        {
            break;
        }
        tail = h;
        printf("\n请输入数组:\n");
        scanf("%d", &num);

        for(; num!=-1; )
        {
            p = (LNode*)malloc(sizeof(LNode));
            p->data = num;
            p->next = NULL;
            tail->next = p;
            tail = p;
            scanf("%d", &num);
        }

        break;
    case 2:
        flag = ListEmpty(h);
        if(flag==1)
        {
            printf("链表为空!");
            break;
        }
        
        num = ListLength(h);
        printf("表长为:%d", num);

        break;
    case 3:
        flag = ListEmpty(h);
        if(flag==1)
        {
            printf("链表为空!");
            break;
        }
        printf("插入数据(输入形式为:插入位置,插入数字数值)\n");
        scanf("%d,%d", &pos, &num);
        flag = ListInsert(h, pos, num);
        if(flag == 0)
        {
            break;
        }
        else
        {
            printf("插入成功!");
        }
        break;
    case 4:
        flag = ListEmpty(h);
        if(flag==1)
        {
            printf("链表为空!");
            break;
        }
        printf("删除数据(输入形式为:删除位置)\n");
        scanf("%d", &pos);
        flag = ListDelete(h, pos, &num);
        if(flag == 0)
        {
            break;
        }
        else
        {
            printf("删除成功!删除数据为:%d", num);
        }
        break;
    case 5:
        flag = ListEmpty(h);
        if(flag==1)
        {
            printf("链表为空!");
            break;
        }
        printf("查找元素(输入待查找的数据元素即可)\n");
        scanf("%d", &num);
        Find(h, num);

        break;
    case 6:
        flag = ListEmpty(h);
        if(flag==1)
        {
            printf("链表为空!");
            break;
        }

        DestroyList(h);
        printf("单链表已销毁。\n");
        break;
    case 7:
        break;
    default:
        printf("\n请确认你所输入的数字为有效作用数字:1 2 3 4 5 6 7\n");
        break;
        ;
    }
    TraverseList(h);
}

/*
  函数名:main
  函数作用:主函数
  入口参数:无
  出口参数:0
  函数编写人:yyk
*/
int main(void)
{
    int choice = 0;
    LNode LinkList;

    Menu();
   
    printf("请输入操作指令:(1 2 3 4 5 6 7):\n");
    scanf("%d", &choice);

    while(choice!=7)
    {
                Work(choice, &LinkList);
        scanf("%d", &choice);
    }
    DestroyList(&LinkList);

    return 0;
}
搜索更多相关主题的帖子: include C语言 元素 include C语言 元素 
2015-10-11 21:58
CUIT快乐
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2015-10-11
收藏
得分:0 
单链表.rar (2.12 KB)
2015-10-11 21:58
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:10 
变量名和数据类型重名了.

指针不熟练啊
程序代码:
#include <stdio.h>
#include <stdlib.h>

void foo2(int **a)
{
    *a = calloc(1, sizeof(int));
    **a = 3;
}

void foo(int *a)
{
    printf("foo : %d\n", *a);
    foo2(&a);
    printf("foo : %d\n", *a);
}

int main(void)
{
    int a;
    foo(&a);
    printf("main : %d\n", a);

    return 0;
}


[fly]存在即是合理[/fly]
2015-10-12 09:52
CUIT快乐
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2015-10-11
收藏
得分:0 
回复 3楼 azzbcc
能不能帮我改成出来看看。我现在对这个也比较混乱。谢谢了
2015-10-12 12:59
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
程序代码:
[16:15:01 azzbcc@XJH-PC Download]$ diff 单链表.c 单链表.c.bak 
190c190
<     PNode p = h;
---
>     PNode p = h->next;
231,236c231,236
< //        flag = InitList(&h);
< //
< //        if(flag==0)
< //        {
< //            break;
< //        }
---
>         flag = InitList(&h);
> 
>         if(flag==0)
>         {
>             break;
>         }
345c345
<     LinkList linkList;
---
>     LNode LinkList;
348c348
<     InitList(&linkList);
---
>     
354c354
<         Work(choice, linkList);
---
>         Work(choice, &LinkList);
357c357
<     DestroyList(linkList);
---
>     DestroyList(&LinkList);


[fly]存在即是合理[/fly]
2015-10-12 16:15
快速回复:一个用C语言编写一个单链表的程序。我一运行就错误,请高手来看看有哪 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.121514 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved