会飞的鱼. 发表于 2017-2-9 21:04:49

求大神看看这段代码哪里有问题,为什么出不来链表的长度还有中间元素呢?

#include<iostream.h>
#include<stdlib.h>
#include<stdio.h>
#include<time.h>

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2

typedef int Status;
typedef int ElemType;

typedef struct LNode
{
        ElemType data;
        struct LNode *next;

}LNode,*LinkList;

//函数原型说明
Status InitList(LinkList &L);
void CreateListTail(LinkList &L,int n);
Status GetElem(LinkList L,int i,ElemType &e);
int printf(LinkList L);
Status GetMidNode(LinkList L,ElemType &e);
int ListLength(LinkList L);




Status InitList(LinkList &L)//创造一个空的单链表

{
        L=(LinkList)malloc(sizeof(LNode));
        if(!L)
                exit(OVERFLOW);
        L->next=NULL;
        return OK;

}//InitList
void CreateListTail(LinkList &L,int n) //按照尾插法随机插入n个元素
{
        LinkList p,r;
        int i;
        srand(time(0));
        L=(LinkList)malloc(sizeof(LNode));
        r=L;
        for(i=1;i<=n;i++)
        {
                p=(LinkList)malloc(sizeof(LNode));
                p->data=rand()%100+1;
                r->next=p;
                r=p;
        }
        r->next=NULL;

}
int ListLength(LinkList L)//单链表的长度
{
        int i=0;
        LinkList p=L->next;
        while(p)
        {
                p=p->next;
                i++;
        }
        return i;
}
Status GetElem(LinkList L,int i,ElemType &e) //返回第i个元素
{
        if(!L)
                return ERROR;
        LinkList p;
        int j;
        p=L->next;
       
        while(p&&j<i)
        {

                p=p->next;
                j++;
        }
        if(!p||j>i)
                return ERROR;
        e=p->data;
        return OK;

}//GetElem


int printf(LinkList L)//输出单链表的元素
{
        if(!L)
                return ERROR;
        LinkList p;
        p=L->next;
        while(p!=NULL)
        {
                printf("%d",p->data);
                p=p->next;
        }
        return OK;
}//output

Status GetMidNode(LinkList L,ElemType &e)//查找中间元素
{
        if(!L)
                return ERROR;
        LinkList mid,search;
        mid=search=L->next;
        while(search->next->next!=NULL)
        {
                mid=mid->next;
                search=search->next->next;
        }
        e=mid->data;
        return OK;

}
void main()
{
        LinkList L ;
        int i,n=6;
        int s;
        ElemType e;
        InitList(L);
        cout<<"请输入您选择的项目:"<<"1.创建链表\n"<<"2.查看链表\n"<<"3.链表长度\n"<<"4.中间元素\n"<<"0.退出\n";
        while(s!='0')
        {

   
    cin>>s;
        switch(s)
        {
        case 1: CreateListTail(L,n); break;
        case 2: printf(L); break;
        case 3: ListLength(L); break;
        case 4: GetMidNode(L,e); break;
        case 0: exit(0);break;
        }
        }
       
}

gascd 发表于 2017-2-10 04:37:41

兄台!我秉着照顾新人的态度,看了你的代码。
首先,你初始化链表就不正确。
初始化链表的函数应该如下
Status InitList(LinkList *L)//注意传参的是 LinkList *
{
    *L=(LinkList)malloc(sizeof(LNode));
    if(!L)
                exit(OVERFLOW);
    (*L)->next=NULL;
    return OK;

}

接下来是你的创建链表的函数。
函数里,你直接把头结点给干掉了!这可不行,因为你后面的相关操作都是假设有头结点的。所以代码应这样写。
void CreateListTail(LinkList *L,int n) //按照尾插法随机插入n个元素
{
    LinkList p,r;
    int i;
    srand(time(0));
    (*L)->next=(LinkList)malloc(sizeof(LNode));      //这里应该是*L的next
    r=(*L)->next;
    for(i=1;i<=n;i++)
    {
            p=(LinkList)malloc(sizeof(LNode));
            p->data=rand()%100+1;
            r->next=p;
            r=p;
    }
    r->next=NULL;
}

最后就是你说的出不来链表的长度还有中间元素。
因为你根本就没有输出!

最后,加油!

会飞的鱼. 发表于 2017-2-9 21:05:21

我用的编译器是VC++6.0

会飞的鱼. 发表于 2017-2-11 20:18:47

gascd 发表于 2017-2-10 04:37
兄台!我秉着照顾新人的态度,看了你的代码。
首先,你初始化链表就不正确。
初始化链表的函数应该如下


*L是什么意思呢   为啥&L不行呢,我们学的是用&L啊。

会飞的鱼. 发表于 2017-2-11 20:45:26

gascd 发表于 2017-2-10 04:37
兄台!我秉着照顾新人的态度,看了你的代码。
首先,你初始化链表就不正确。
初始化链表的函数应该如下


error LNK2001: unresolved external symbol "void __cdecl CreateListTail(struct LNode * &,int)" (?CreateListTail@@YAXAAPAULNode@@H@Z)这是啥意思呢?

gascd 发表于 2017-2-11 22:34:10

会飞的鱼. 发表于 2017-2-11 20:18
*L是什么意思呢   为啥&L不行呢,我们学的是用&L啊。

建议重修C语言指针那一章。

Code_mzh 发表于 2018-1-14 17:11:04

gascd 发表于 2017-2-10 04:37
兄台!我秉着照顾新人的态度,看了你的代码。
首先,你初始化链表就不正确。
初始化链表的函数应该如下


用&也可以,他只是没有输出而已。
在遍历单链表和求中间长度那段代码最后加一个输出就行了

Code_mzh 发表于 2018-1-14 17:11:40

gascd 发表于 2017-2-11 22:34
建议重修C语言指针那一章。

&L可以的
页: [1]
查看完整版本: 求大神看看这段代码哪里有问题,为什么出不来链表的长度还有中间元素呢?