#include "stdlib.h"
#include "iostream.h"
#define ERROR 0
#define OK 1
typedef int elemtype;
typedef struct lnode{
elemtype data;
struct lnode* next;
}lnode,*linklist;
void init_linklist(linklist &p)//链表参数采用引用参数,因初始化链表是从没有链表到有链表,并且要保留这个空链表以便后面使用,所以必须采用引用参数。当然采用指针参数也是可以的。
{
p=(linklist)malloc(sizeof(lnode));
p->next=NULL;
}
void crt_linklist(linklist &p,int len)//链表参数采用引用参数,与初始化同理
{
init_linklist(p);
lnode* t;
t=p;
lnode* s;
for(int i=1;i<=len;i++)
{
s=(linklist)malloc(sizeof(lnode));
s->data=i*10;
s->next=NULL;
t->next=s;
t=s;
}
}
void output_linklist(linklist p)//链表参数采用赋值参数,因为输出不改变链表结构
{
lnode* q=p->next;
int i=1;//初值设为1,因为是从第一个元素开始输出的
while(q)
{
cout<
i++;
}
}
int main()
{
linklist p;
int i=30;//最好用int,这里是定义长度的,不是定义一个数据元素;或者typedef int Length; Length i=30;更好,呵呵
crt_linklist(p,i);
output_linklist(p);
return 0;
}
你的 crt_linklist函数有问题,应为在你的主函数中,你在调用 crt_linklist函数时,实际上进行的的是值传递!你后来的初始化函数init_linklist以及创建链表函数crt_linklist对p都没有什么影响!这两个函数所做的工作就只是对自己的形参处理了而已,当函数调用结束时,一切又消失了,实参p还是原来的样子。你可以考虑在主函数中这样修改就可以了:
int main()
{
lnode l;
elemtype i=30;
crt_linklist(&l,i);
output_linklist(&l);
return 0;
}
这种问题自己必须想明白,我们当初学习时也经常碰到这种问题,但只要你好好想想,这些问题就都能想明白的,你可以不断实践加深自己的理解!
可以自己先调试一下 相信你会发现问题的