奇怪!指针也不能正确带回参数值。。。。。。。。。。。。。

Mr_Yang 2005-11-05 09:40:44
#include <stdio.h>
#include <stdlib.h>

struct NODE
{
int num;
struct NODE *next;
};

struct NODE *create(void) // 创建链表
{
int n = 0;
struct NODE *head = NULL;
struct NODE *p1, *p2;

p1 = p2 = (struct NODE *)malloc(sizeof(struct NODE));
scanf("%d", &p1->num);

while (p1->num != 0)
{
n++;
if (1 == n)
head = p1;
else
p2->next = p1;

p2 = p1;
p1 = (struct NODE *)malloc(sizeof(struct NODE));
scanf("%d", &p1->num);
}
p2->next = NULL;
return head;
}

void destory(struct NODE *LinkList) // 释放链表
{
if (&LinkList == NULL)
return;

struct NODE *p1, *p2;
p1 = LinkList;
while(p1->next != NULL)
{
p2 = p1->next;
free(p1);
p1 = p2;
}
}

void Reverse(struct NODE *LinkList) // 求链表的逆序
{
if (LinkList == NULL || LinkList->next == NULL)
return ;

struct NODE *p, *p1, *p3;

p = p3 = LinkList;
p1 = LinkList->next;

while(p1->next != NULL)
{
LinkList->next = p1->next;
p = p1;
p1->next = p3;
p3 = p1;
p1 = LinkList->next;
}
LinkList->next = NULL;
p1->next = p3;
p = p1;


LinkList = p;
LinkList->next = p->next; //???????????????????
// return LinkList;
}

void Print(struct NODE *LinkList) // 打印链表
{
struct NODE *p;
p = LinkList;
while (p != NULL)
{
printf("%d\t", p->num);
p = p->next;
}
printf("\n");
}

void main(void)
{
struct NODE *list;

list = create();
Print(list);
Reverse(list);
Print(list);
destory(list);
}

如题,本程序为实现一个链表的逆序,在上面的?????????????处linklist的值是正确的,但传给主函数的list就不对了。
输入:1 2 3 4 5 0
Reverse()中linklist:为5->4->3->2->1->NULL
但到了主函数中list: 1->NULL;
请各位高手看看是怎么回事?
...全文
312 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
0黄瓜0 2005-11-06
  • 打赏
  • 举报
回复
create函数有点问题,Reverse函数应声明为指针的引用 全部程序如下(运行通过):

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

struct NODE
{
int num;
struct NODE *next;
};

struct NODE *create(void) // 创建链表
{
int n = 0;
struct NODE *head = NULL;
struct NODE *p1, *p2;

p1 = p2 = (struct NODE *)malloc(sizeof(struct NODE));
scanf("%d", &p1->num);

/* while (p1->num != 0)
{
n++;
if (1 == n)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = (struct NODE *)malloc(sizeof(struct NODE));
scanf("%d", &p1->num);
} */
while (1)
{

if(head==NULL)
head=p2;
else
{
int temp;
scanf("%d", &temp);
if(0==temp) break;
p1 = (struct NODE *)malloc(sizeof(struct NODE));
p1->num=temp;
p2->next=p1;
p2=p1;
}//if else
}//while
p2->next = NULL;
return head;
}

void destory(struct NODE *LinkList) // 释放链表
{
//if (&LinkList == NULL)
if (LinkList == NULL)
return;

struct NODE *p1, *p2;
p1 = LinkList;
while(p1->next != NULL)
{
p2 = p1->next;
free(p1);
p1 = p2;
}
}

void Reverse(struct NODE *&LinkList) // 求链表的逆序
{
if (LinkList == NULL || LinkList->next == NULL)
return ;

struct NODE *p, *p1, *p3;

p = p3 = LinkList;
p1 = LinkList->next;

while(p1->next != NULL)
{
LinkList->next = p1->next;
p = p1;
p1->next = p3;
p3 = p1;
p1 = LinkList->next;
}
LinkList->next = NULL;
p1->next = p3;
p = p1;


LinkList = p;
LinkList->next = p->next; //???????????????????
// return LinkList;

}

void Print(struct NODE *LinkList) // 打印链表
{
struct NODE *p;
p = LinkList;
while (p != NULL)
{
printf("%d\t", p->num);
p = p->next;
}
printf("\n");
}

void main(void)
{
struct NODE *list;

list = create();
Print(list);
Reverse(list);
Print(list);
destory(list);
}
Mr_Yang 2005-11-06
  • 打赏
  • 举报
回复
请问:*&LinkList 这个该怎么解释?

如果对一个指针加引用,是不是应该这样 &(*LinkList)?
chinaren2 2005-11-06
  • 打赏
  • 举报
回复
void main(void)
{
struct NODE *list;

list = create();
Print(list);
list=Reverse(list);
Print(list);
destory(list);
}
不就行了,申明变量的问题,你的code里面的第二个Print里面的list的地址还是以前的create的list的地址,那肯定不正确了!!!
jixingzhong 2005-11-06
  • 打赏
  • 举报
回复
并没有反馈到调用函数 (就是主函数) 中,
所以, 输出的时候, 就成了楼主你那样的结果了 !!

办法:
1 加个引用 !
2 用 2 级的指针 !
jixingzhong 2005-11-06
  • 打赏
  • 举报
回复
在 你的 Reverse函数中, 有这么个语句 :
LinkList = p; !!!

恩, 楼主想到了用指针
不过, 指针的 "传址" 是相对的 !!!

这个明白么 ?

指针实际上传的 也还是 值 !!!!!
不过, 这个值狠特殊, 是一个地址
(当然, 你乐意的话, 当一般的数来处理也可以. 不过, 问题就来了 呵呵)

楼主的程序中的这个 指针改变的语句 ...
rwxybh 2005-11-06
  • 打赏
  • 举报
回复
楼主的程序问题很多
create问题:head可能返回NULL
void destory(struct NODE *LinkList) // 释放链表
{
if (&LinkList == NULL) 、???????????????
为什么是&LinkList
return;
Reverse处理有问题
Mr_Yang 2005-11-06
  • 打赏
  • 举报
回复
为什么Reverse函数应声明为指针的引用呢????

在函数中指针明明已经指向了链表的头,为什么却不等将它带回?

我现在要搞明白的是这个问题!
happydivid 2005-11-05
  • 打赏
  • 举报
回复
不奇怪,楼主代码中所有的指针都是局部变量,函数调用完毕它们就全部释放了。
http://blog.csdn.net/happydivid/archive/2005/10/30/519510.aspx
我这儿有篇帖子是讲有关函数变量的,楼主可以看看,再将代码修改一下,应该就行了

70,023

社区成员

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

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