有关链表的问题

sunyuqian 2010-03-18 01:07:57
大家好,这道题有两个疑问,用/**/标出,请高手解答

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

#define TSIZE 20

struct film
{
char title[TSIZE];
int rating;
struct film * next;
};

int main(void)
{
struct film * head = NULL;
struct film * prev,* current;
char input[TSIZE];

printf("输入名字:\n");
while(gets(input) != NULL && input[0] != '\0')
{
current = (struct film *)malloc(sizeof(struct film));
if(head == NULL)
head = current;
else
prev->next = current;
current->next = NULL;
strcpy(current->title,input);
printf("输入等级:\n");
scanf("%d",¤t->rating);
while(getchar() != '\n')
continue;
printf("输入下一个标题:\n");
prev = current;
/*这个地方,首先先问上面else部分的prev->next = current这句话,当执行prev->next的时候,是不是就创建了一个新的
struct film *结构?
如果是,那上面prev = current;这句话就明白了,把每次新的prev 指向新创建的current
如果不是,prev = current;这句话就不明白了,每次都执行,相当于把前面的指针值覆盖了*/
}
if(head == NULL)
printf("没有数据\n");
else
printf("数据如下:\n");
current = head;
while(current != NULL)
{
printf("%s,%d\n",current->title,current->rating);
current = current->next;
}
current = head;
/////////////////////////////////////
while(current != NULL)
{
free(current);
current = current->next;
}
/*这道题运行时是错的,原因在释放这段代码,是不是因为free(current);把current释放掉,current指针里的值未知了,
所以current = current->next;就不一定是下一个表了?怎么改好呢*/
////////////////////////////////////
return 0;
}
...全文
71 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunyuqian 2010-03-18
  • 打赏
  • 举报
回复
谢谢了
_JeffreyWu 2010-03-18
  • 打赏
  • 举报
回复
1. 上面,如果执行到else分支,说明head不是空,即current不空,也就是prev不空,这里只是把prev里的next指向 current,并没有创建一个新的结构,创建只有调用 malloc才会创建
prev = current,只是把当前节点作为上一个节点

2. 是过河拆桥,不是拆桥过河

huanmie_09 2010-03-18
  • 打赏
  • 举报
回复

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

#define TSIZE 20

struct film
{
char title[TSIZE];
int rating;
struct film * next;
};

int main(void)
{
struct film * head = NULL;
struct film * prev,* current;
char input[TSIZE];

printf("输入名字:\n");
while(gets(input) != NULL && input[0] != '\0')
{
current = (struct film *)malloc(sizeof(struct film));
if(head == NULL)
head = current;
else
prev->next = current;
current->next = NULL;
strcpy(current->title,input);
printf("输入等级:\n");
scanf("%d",¤t->rating);
while(getchar() != '\n')
continue;
printf("输入下一个标题:\n");
prev = current;
/*这个地方,首先先问上面else部分的prev->next = current这句话,当执行prev->next的时候,是不是就创建了一个新的
struct film *结构?
如果是,那上面prev = current;这句话就明白了,把每次新的prev 指向新创建的current
如果不是,prev = current;这句话就不明白了,每次都执行,相当于把前面的指针值覆盖了*/
/*当然不是创建一个新的结构, 这里prev = current;只是让pre保持指向当前最新创建的节点, 以便插入下一个节点的时候, 执行prev->next = current;就是将current插入到当前链表尾*/
}
if(head == NULL)
printf("没有数据\n");
else
printf("数据如下:\n");
current = head;
while(current != NULL)
{
printf("%s,%d\n",current->title,current->rating);
current = current->next;
}
current = head;
/////////////////////////////////////
while(current != NULL)
{
prev = current->next; /*先保存后一个节点*/
free(current);
current = prev; /*再将后一个节点赋值给current*/
}
/*这道题运行时是错的,原因在释放这段代码,是不是因为free(current);把current释放掉,current指针里的值未知了,
所以current = current->next;就不一定是下一个表了?怎么改好呢*/
////////////////////////////////////
return 0;
}
tan870426 2010-03-18
  • 打赏
  • 举报
回复
最后while的那个地方改成这样

while(current != NULL)
{
prev = current;
current = current->next;
free(prev);
}
zyl072 2010-03-18
  • 打赏
  • 举报
回复
第一个地方,当执行prev->next的时候,不会创建新结构。prev = current;确实把prev给覆盖了,不过没有关系,因为这是个链表结构,只需要保存一个头指针,一个尾指针就够了。head相当于头指针,prev是尾指针。

第二个敌方,可以先用一个其他变量将current->next保存到临时变量,然后再释放current,再将临时变量赋给current.
guoyu_bo 2010-03-18
  • 打赏
  • 举报
回复

void freeAll(list_t *head)/*from head to rear free the node in the list*/
{
list_t *before,*pt;

if ( head->next != NULL )
{
pt=head->next;
while ( pt->next != NULL )
{
before=pt;
pt=pt->next;
free(before);
}
free(pt);
}
free(head);
}
tan870426 2010-03-18
  • 打赏
  • 举报
回复
/*这个地方,首先先问上面else部分的prev->next = current这句话,当执行prev->next的时候,是不是就创建了一个新的
struct film *结构?
如果是,那上面prev = current;这句话就明白了,把每次新的prev 指向新创建的current
如果不是,prev = current;这句话就不明白了,每次都执行,相当于把前面的指针值覆盖了*/

这个地方是把上面current = (struct film *)malloc(sizeof(struct film));这句申请的结构赋值给
prev->next,是把已经创建好的结构赋值过去,仅仅是赋值!


/*这道题运行时是错的,原因在释放这段代码,是不是因为free(current);把current释放掉,current指针里的值未知了,
所以current = current->next;就不一定是下一个表了?怎么改好呢*/
这个地方刚刚free过了...你又给他赋值,肯定是错误的了

69,373

社区成员

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

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