注册 登录
编程论坛 C++教室

数据结构链表 取结点数据值出了点小问题

yuanpeng 发布于 2017-05-08 22:08, 2905 次点击
程序代码:
/*链表: 建立单链表,顺序输入5个数,然后在第3个结点前面插入一个结点,接着
删除第3个结点,并显示表中所有结点数据值,给定1-5中的任意整数i,给出链表
中第i个结点的数据值。
*/

#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -2
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;

//链表的类型定义
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;

//链表的初始化函数定义
Status InitList(LinkList &L)
{
    L=(LinkList)malloc(sizeof(LNode));
    if(!L)exit(OVERFLOW);
    L->next=NULL;
    return OK;
}

//链表的建立函数定义
void CreateList(LinkList &L,int n)
{
    //逆序输入n个元素的值,建立带表头结点的线性链表
    int i; LinkList p;
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL; //建立头结点
    printf("输入数据: ");
    for(i=n;i>0;--i)
    {
        p=(LinkList)malloc(sizeof(LNode)); //生成新结点
        scanf("%d",&p->data);
        p->next=L->next;  L->next=p; //插入到表头
    }
}

//链表的插入函数定义
Status ListInsert(LinkList &L,int i,ElemType e)
{
    //在带头结点的线性链表L中第i元素结点之前插入元素e

    LinkList p,s; int j=0;
    p=L;
    while(p&&j<i-1) //寻找第i个元素前面一个结点
    {
        p=p->next;    //p指向第1个元素结点时,j=1....p指向第i-1个元素结点时,j=i-1,不再执行
        ++j; //j用于计数
    }
    if(!p||j>i-1) //i小于1或者大于表长
        return ERROR;
    s=(LinkList)malloc(sizeof(LNode)); //分配新结点
    s->data=e;
    s->next=p->next;  p->next=s; //在第i-1个结点和第i个结点之间插入
    return OK;
}

//链表的删除函数定义
Status ListDelete(LinkList &L,int i,ElemType &e)
{
    //在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
    LinkList p,q; int j=0;
    p=L;
    while(p->next&&j<i-1)//寻找第i个元素前面一个结点,用p指向该结点
    {
        p=p->next;
        ++j;
    }
    if(!(p->next)||j>i-1)
        return ERROR;
    q=p->next;  p->next=q->next;//p指向第i-1个元素,q指向第i个元素,然后将第i个和第i+1个元素连接
    e=q->data;
    free(q);
    return OK;
}

//给定i值,获得链表中对应结点数据值的函数定义
Status GetElem(LinkList L,int i,ElemType &e)
{
    LinkList p;
    int j;
    p=L->next; j=1;
    while(p&&j<i)
    {
        p=p->next;
        ++j;
    }
    if(!p&&j>i)
        return ERROR;
    e=p->data;
    return OK;
}

//链表的销毁函数定义
Status Destroy(LinkList &L)
{
    LinkList p;
    while(L=!NULL)
    {
        p=L->next;
        free(L);     //从开头开始释放空间
        L=p;
    }
}

//链表各结点数据值打印输出函数定义
void print(LinkList &L)
{
    LinkList p;
    p=L->next;
    if(L!=NULL)
    {
        printf("打印输出: ");
        do{
            printf("%d ",p->data);
            p=p->next;
        }while(p!=NULL);
    }
}

void main()
{
    //变量定义
    LinkList L;
    ElemType e;
    int i;

    //链表初始化函数调用
    InitList(L);

    //链表建立函数调用
    CreateList(L,5);

    //链表各结点数据值打印输出函数调用
    print(L);


    //链表的插入函数调用,实现在第3个结点前面插入一个结点,结点数据值通过键盘输入
    printf("\n在第3个结点前面插入一个结点:");
    scanf("%d",&e);
    ListInsert(L,3,e);

    //链表各结点数据值打印输出函数调用
    print(L);


    //链表的删除函数调用,实现删除第3个结点,删除的结点数据值复制给变量e
    printf("\n删除第三个结点,");
    ListDelete(L,3,e);

    //链表各结点数据值打印输出函数调用
    print(L);

    //给定i值,获得链表中对应结点数据值的函数调用
    printf("\n取第i个结点的数据值: ");
    scanf("%d",&i);
    GetElem(L,i,e);
    printf("Data值为: %d\n",e);

    //链表的销毁函数调用
    Destroy(L);
}

只有本站会员才能查看附件,请 登录
14 回复
#2
yuanpeng2017-05-08 22:10
运行的时候输入取 i 结点的数据值,弹出了"Data值为 :3",然后就弹出了停止工作的窗口
#3
renkejun19422017-05-08 22:13
你的编译器真NB,这么多错误,外加警告,竟然还能通过编译。

ceshi7.c:17:26: error: expected ';', ',' or ')' before '&' token
 Status InitList(LinkList &L)
                          ^
ceshi7.c:26:26: error: expected ';', ',' or ')' before '&' token
 void CreateList(LinkList &L,int n)
                          ^
ceshi7.c:42:28: error: expected ';', ',' or ')' before '&' token
 Status ListInsert(LinkList &L,int i,ElemType e)
                            ^
ceshi7.c:62:28: error: expected ';', ',' or ')' before '&' token
 Status ListDelete(LinkList &L,int i,ElemType &e)
                            ^
ceshi7.c:81:42: error: expected ';', ',' or ')' before '&' token
 Status GetElem(LinkList L,int i,ElemType &e)
                                          ^
ceshi7.c:98:25: error: expected ';', ',' or ')' before '&' token
 Status Destroy(LinkList &L)
                         ^
ceshi7.c:110:21: error: expected ';', ',' or ')' before '&' token
 void print(LinkList &L)
                     ^
ceshi7.c: In function 'main':
ceshi7.c:132:5: warning: implicit declaration of function 'InitList' [-Wimplicit-function-declaration]
     InitList(L);
     ^
ceshi7.c:135:5: warning: implicit declaration of function 'CreateList' [-Wimplicit-function-declaration]
     CreateList(L,5);
     ^
ceshi7.c:138:5: warning: implicit declaration of function 'print' [-Wimplicit-function-declaration]
     print(L);
     ^
ceshi7.c:144:5: warning: implicit declaration of function 'ListInsert' [-Wimplicit-function-declaration]
     ListInsert(L,3,e);
     ^
ceshi7.c:152:5: warning: implicit declaration of function 'ListDelete' [-Wimplicit-function-declaration]
     ListDelete(L,3,e);
     ^
ceshi7.c:160:5: warning: implicit declaration of function 'GetElem' [-Wimplicit-function-declaration]
     GetElem(L,i,e);
     ^
ceshi7.c:164:5: warning: implicit declaration of function 'Destroy' [-Wimplicit-function-declaration]
     Destroy(L);
     ^
#4
yuanpeng2017-05-08 22:29
回复 3楼 renkejun1942
微软VC++6.0啊,我也不知道为什么到你这里会这样
#5
renkejun19422017-05-08 22:36
你这貌似不是C,是C++,需要我帮你把帖子转到C++版面么?
查询之后,我可以肯定,你这是C++。
#6
yuanpeng2017-05-08 22:42
回复 5楼 renkejun1942
啊啊???我们学C都是用这个编译的喔。如果是C++那就麻烦你了
#7
renkejun19422017-05-08 22:44
回复 6楼 yuanpeng
你的函数参数的&号,是C++ 的语法,不是C的,C语言没有这种写法。
#8
yuanpeng2017-05-08 22:45
回复 7楼 renkejun1942
这个&好像是引用的意思
#9
renkejun19422017-05-08 22:48
回复 8楼 yuanpeng
那是C++的语法,C语言是没有这种语法的。
我编译之后一堆的报错信息也就可以解释了。
C语言没有引用的概念。

要么是你们老师把C++当成了C语言教,当然我觉得这不太可能。
要么你肯定学错了东西,C++虽然宣传说是C的超集,但它和C是截然不同的两种语言。

[此贴子已经被作者于2017-5-8 22:50编辑过]

#10
yuanpeng2017-05-08 22:54
回复 9楼 renkejun1942
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
#11
renkejun19422017-05-08 22:58
回复 10楼 yuanpeng
真NB。把C++当C语言,写这教材的也是神人。

而且我敢打赌你的源文件的后缀是.cpp。
你要还觉得我弄错了,你把后缀改成C语言的后缀.c。
看看你的代码能不能通过编译。

至于.cpp是什么文件的后缀,你百度下就知道了。

如果都这样了,你还觉得我弄错了。那我也就没什么好说的了。

[此贴子已经被作者于2017-5-8 23:02编辑过]

#12
yuanpeng2017-05-08 23:15
回复 11楼 renkejun1942
我也没质疑你,我也是挺疑惑的,如有冒犯对不起啊
#13
renkejun19422017-05-08 23:17
回复 12楼 yuanpeng
没什么,估计那书你也看了很久,估计第一次听到有人说你学的不是C,而是C++,疑惑也是应该的。

不知道你学了多久,如果时间挺长的话,买本C++语法的书,重新开始吧。
#14
yuanpeng2017-05-08 23:31
回复 13楼 renkejun1942
学校说是学C,结果被你这么一说才知道是C++,那么我应该去学C还是C++呀,有没有什么好的建议
#15
renkejun19422017-05-08 23:32
回复 14楼 yuanpeng
不知道,看你的兴趣了。
C的复杂,源于它的简单。
C++的复杂,源于……嗯……它就是很复杂。
1