链表问题

kinglonghr 2004-05-04 01:59:31
代码如下:
把一个链表逆序排列,即将链表的头当链表的尾,链表的尾当链表的头

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

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

main()
{

int len =1 , i ;
struct stu *p1, *p2,*head, *new ,*newhead;

//建立链表

p1=p2=head = (struct stu * ) malloc ( sizeof (struct stu ) ) ;
printf("Input number ( 0: list end ) : ");
scanf( "%d",&p1->num);
while ( p1->num != 0 )
{
p1 = ( struct stu * ) malloc ( sizeof ( struct stu ) ) ;
printf("Input number ( 0 :list end ): " );
scanf("%d",&p1->num );
if(p1->num == 0 )
p2->next = NULL ;
else
{
p2->next = p1;
p2 = p1;
len ++ ;
}

}
// 输出原链表

p1=head;
printf("\n the orginal list :\n");
do
{
printf("%4d",p1->num);
if(p1->next !=NULL )
p1 =p1->next ;
}while ( p1->next != NULL ) ;
printf("%4d",p1->num);

//输出新链表

for( i=0;i<len;i++)
{
p2=p1=head;
while (p1->next != NULL )
{
p2 =p1;
p1 =p1->next;
}
if( i == 0 )
newhead = new = p1;
else
new= new->next =p1;
p2 ->next = NULL;
}
printf("\n THhe list :\n");

p1= newhead;
for( i=0;i<len; i++)
{
printf("%4d",p1->num);
p1=p1->next;
}
printf("\n");

}

问题如下:
在输出链表部分的for如何解释,以及能否详细说明一下这个算法非常感谢
...全文
109 5 点赞 打赏 收藏 举报
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
kinglonghr 2004-05-04
谢谢大家了 马上结帐
  • 打赏
  • 举报
回复
cngdzhang 2004-05-04
动态分配了内存,使用完,要释放的,否则会造成内存泄露
struct stu *p;

p=head;

while(p)
{
head=head->next;
free(p);
p=head;
}
  • 打赏
  • 举报
回复
lonelyplanet 2004-05-04
输出链表部分有两个for语句,第二个是输出,即顺序print出每个节点内容,不说了。
第一个for语句是把已建立的链表逆序。
解释如下:
0)重复以下(1)-(3)步骤n次(n为链表长度),
1)找到当前链表的最后一个和倒数第二个节点
p2=p1=head;
while (p1->next != NULL )
{
p2 =p1;
p1 =p1->next;
}
2)如果是第一次循环,则把找到的最后一个节点作为新的逆序链表的头节点,否则把找到的最后一个节点连接到逆序链表上。
if( i == 0 )
newhead = new = p1;
else
new= new->next =p1;
3)倒数第二个节点的next置为NULL,即把最后一个节点从远链表中取下来。
p2 ->next = NULL;

补充一点:程序中应该加上free语句。
  • 打赏
  • 举报
回复
kinglonghr 2004-05-04
谢谢兄弟我看懂了,能告诉我“补充一点:程序中应该加上free语句” 这句该怎么处理呢?
  • 打赏
  • 举报
回复
kinglonghr 2004-05-04
在VC这个程序可以编译通过的
请指教分不够可以再加 同时想问一下 是否需要把数据结构搞的扎实一点?
  • 打赏
  • 举报
回复
相关推荐
发帖
C语言
加入

6.5w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2004-05-04 01:59
社区公告
暂无公告