求大神看看这段代码哪里有问题,为什么出不来链表的长度还有中间元素呢?
#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;
}
}
} 兄台!我秉着照顾新人的态度,看了你的代码。
首先,你初始化链表就不正确。
初始化链表的函数应该如下
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;
}
最后就是你说的出不来链表的长度还有中间元素。
因为你根本就没有输出!
最后,加油!
我用的编译器是VC++6.0 gascd 发表于 2017-2-10 04:37
兄台!我秉着照顾新人的态度,看了你的代码。
首先,你初始化链表就不正确。
初始化链表的函数应该如下
*L是什么意思呢 为啥&L不行呢,我们学的是用&L啊。 gascd 发表于 2017-2-10 04:37
兄台!我秉着照顾新人的态度,看了你的代码。
首先,你初始化链表就不正确。
初始化链表的函数应该如下
error LNK2001: unresolved external symbol "void __cdecl CreateListTail(struct LNode * &,int)" (?CreateListTail@@YAXAAPAULNode@@H@Z)这是啥意思呢? 会飞的鱼. 发表于 2017-2-11 20:18
*L是什么意思呢 为啥&L不行呢,我们学的是用&L啊。
建议重修C语言指针那一章。 gascd 发表于 2017-2-10 04:37
兄台!我秉着照顾新人的态度,看了你的代码。
首先,你初始化链表就不正确。
初始化链表的函数应该如下
用&也可以,他只是没有输出而已。
在遍历单链表和求中间长度那段代码最后加一个输出就行了 gascd 发表于 2017-2-11 22:34
建议重修C语言指针那一章。
&L可以的
页:
[1]