鱼C论坛

 找回密码
 立即注册
查看: 4649|回复: 7

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

[复制链接]
发表于 2017-2-9 21:04:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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;
        }
        }
        
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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;
}

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

最后,加油!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 1

使用道具 举报

 楼主| 发表于 2017-2-9 21:05:21 | 显示全部楼层
我用的编译器是VC++6.0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-11 20:18:47 | 显示全部楼层
gascd 发表于 2017-2-10 04:37
兄台!我秉着照顾新人的态度,看了你的代码。
首先,你初始化链表就不正确。
初始化链表的函数应该如下

*L是什么意思呢   为啥&L不行呢,我们学的是用&L啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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)  这是啥意思呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-11 22:34:10 | 显示全部楼层
会飞的鱼. 发表于 2017-2-11 20:18
*L是什么意思呢   为啥&L不行呢,我们学的是用&L啊。

建议重修C语言指针那一章。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-14 17:11:04 | 显示全部楼层
gascd 发表于 2017-2-10 04:37
兄台!我秉着照顾新人的态度,看了你的代码。
首先,你初始化链表就不正确。
初始化链表的函数应该如下

用&也可以,他只是没有输出而已。
在遍历单链表和求中间长度那段代码最后加一个输出就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-14 17:11:40 | 显示全部楼层
gascd 发表于 2017-2-11 22:34
建议重修C语言指针那一章。

&L可以的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 00:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表