链表中的指针问题

zhfcmx 2009-03-01 04:34:35
链表定义如下
typedef struct lnode
{
int data;
struct lnode *next;
}lnode,*linklist;
其中创建链表以及输出链表函数如下:
createlist(linklist l,int n_first,int n_last)
{
int i,j;
linklist p,q;
l=(linklist)malloc(sizeof(struct lnode));
j=n_last;
q=l;
for(i=n_first;i<=j;i++)
{
p=(linklist)malloc(sizeof(struct lnode));
p->data=i;
q->next=p;
q=q->next;
}
q->next=NULL;
return 1;
}
output(linklist l)
{
linklist p;
p=l->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
return 1;
}
函数中的参数定义的为linklist l,这样的话运行的系统提示错,如果改为linklist *l;就可以正常输出,l本来就是个指针,为什么要定义为linklist *l才行呢?请大家讲讲
...全文
115 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
fox000002 2009-03-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zhfcmx 的回复:]
那我那个交集函数又怎么解释呢?
[/Quote]

交集函数 lz 没有改变 q 的值

只是使用了 q 的值


  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fox000002 的回复:]
C/C++ codecreatelist(linklist l,int n_first,int n_last)



lz 这里的使用有问题

因为在这个函数中,l 是个临时变量,出了这个函数作用域就被销毁了

使用时如果传递一个 linklist 类型变量的话,函数调用后这个变量值根本没有改变

这个经典的 swap 函数是一个道理,只是这里的变量类型变成了 linklist,而不是 int 等基本类型

关键的是 lz 要在函数中改变外部的变量这个问题
[/Quote]

嗯,主要是楼主思路不清晰,导致出现问题,在函数体内malloc获得的指针,一定要传指针或者引用,不然会丢失指针,然后就是内存泄露。
改成codecreatelist(linklist &l,int n_first,int n_last) 比较合适。
higoalhwl 2009-03-01
  • 打赏
  • 举报
回复
回复6楼:因为你这个函数linklist q是作为入参使用的,并不需要作为出参传出,
函数内部都在对局部变量操作,所以不会出错。
zhfcmx 2009-03-01
  • 打赏
  • 举报
回复
那我那个交集函数又怎么解释呢?
fox000002 2009-03-01
  • 打赏
  • 举报
回复
void swap1(char *s1, char *s2)
{
char *tmp;
tmp = s1;
s1 = s2;
s2 = tmp;
}

void swap2(char **s1, char **s2);
{
char *tmp;
tmp = *s1;
*s1 = *s2;
*s2 = tmp;
}

int main()
{
char *p1 = "str1";
char *p2 = "str2";

swap1(p1, p2); // 执行后,p1 和 p2 没改变

swap2(&p1, &p2); // 执行后,p1 和 p2 值交换

return 0;
}
higoalhwl 2009-03-01
  • 打赏
  • 举报
回复
creatlist函数的目的是为了给linklist指针分配一个空间,并作为函数的参数传出。
这就要求你必须把指针的地址传进去才可以,因此createlist函数的一个参数就必须是
指向指针的指针(双指针)

按照你目前的代码,由于调用createlist函数之后,linklist并没有指向实际的空间,因
此你在之后使用linklist时会因为使用了一个未初始化的指针而出现断错误。

1楼可以正常运行的原因应该是在调用createlist函数之后就没有再去使用指针l了。
zhfcmx 2009-03-01
  • 打赏
  • 举报
回复
关键的是 lz 要在函数中改变外部的变量这个问题,怎么改变呢?还望说明白一点。我还写了个交集函数
intersection(linklist q,linklist l,linklist p)
{
//int i,j;
linklist a,b,c;
a=l->next;
b=p->next;
c=q;
while(a&&b)
{
c->next=(linklist)malloc(sizeof(lnode));
if(a->data<b->data)
{
c->next->data=a->data;
c=c->next;
a=a->next;
}
else if(a->data>b->data)
{
c->next->data=b->data;
c=c->next;
b=b->next;
}
else
{
c->next->data=a->data;
c=c->next;
a=a->next;
b=b->next;
}
}
while(a==NULL&&b)
{
c->next=(linklist)malloc(sizeof(lnode));
c->next->data=b->data;
c=c->next;
b=b->next;
}
while(b==NULL&&a!=NULL)
{
c->next=(linklist)malloc(sizeof(lnode));
c->next->data=a->data;
c=c->next;
a=a->next;
}
c->next=NULL;
return 1;
}
这个函数也定义的是linklist q没有带*号,为什么这个函数就能输出?实在不解
这个函数的作用是将两个链表合并
lingyin55 2009-03-01
  • 打赏
  • 举报
回复
mark
[Quote=引用 2 楼 fox000002 的回复:]
C/C++ codecreatelist(linklist l,int n_first,int n_last)



lz 这里的使用有问题

因为在这个函数中,l 是个临时变量,出了这个函数作用域就被销毁了

使用时如果传递一个 linklist 类型变量的话,函数调用后这个变量值根本没有改变

这个经典的 swap 函数是一个道理,只是这里的变量类型变成了 linklist,而不是 int 等基本类型

关键的是 lz 要在函数中改变外部的变量这个问题
[/Quote]
ysmashimaro 2009-03-01
  • 打赏
  • 举报
回复
没太懂,帮顶!
johndiyang 2009-03-01
  • 打赏
  • 举报
回复
接分~!
生命周期的问题~!
fox000002 2009-03-01
  • 打赏
  • 举报
回复
createlist(linklist l,int n_first,int n_last) 


lz 这里的使用有问题

因为在这个函数中,l 是个临时变量,出了这个函数作用域就被销毁了

使用时如果传递一个 linklist 类型变量的话,函数调用后这个变量值根本没有改变

这个经典的 swap 函数是一个道理,只是这里的变量类型变成了 linklist,而不是 int 等基本类型

关键的是 lz 要在函数中改变外部的变量这个问题
  • 打赏
  • 举报
回复
我定义的是linklist l,加了个mani()函数,跑了下,没有问题,楼主你确定有问题吗?
对了createlist(linklist l,int n_first,int n_last)
这些函数里面有return,就声明成这样:
int createlist(linklist l,int n_first,int n_last)


typedef struct lnode
{
int data;
struct lnode *next;
}lnode,*linklist;

int createlist(linklist l,int n_first,int n_last)
{
int i,j;
linklist p,q;
l=(linklist)malloc(sizeof(struct lnode));
j=n_last;
q=l;
for(i=n_first;i <=j;i++)
{
p=(linklist)malloc(sizeof(struct lnode));
p->data=i;
q->next=p;
q=q->next;
}
q->next=NULL;
return 1;
}

int output(linklist l)
{
linklist p;
p=l->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
return 1;
}

void main()
{
linklist l;
int i =0,j=5;
createlist(l,i,j) ;
}

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧