| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 692 人关注过本帖
标题:[求助]书上的习题,链表相关的
只看楼主 加入收藏
lg_mic
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-9-18
收藏
 问题点数:0 回复次数:5 
[求助]书上的习题,链表相关的
输入10个整数,将其中最小的数与第一个数对换,用链表存放这些整数。
这道题,用链表来做是不是有点困难?
以下是我试做的部分
struct node{
int a;
struct node *link;
};
node *head;
int main(void)
{
int i,b;
node *p,*p1,*temp;
for(i=0;i<10;i++)
{p=(node *)malloc(sizeof(node));
p->link=NULL;
printf("input the %d number:",i);
scanf("%d",&p->a);
if(i==0){head=p;temp=p;}
else{
temp->link=p;
temp=temp->link;
}
}
b=head->a;
for(p=head;p!=NULL;p=p->link)
if(b>p->a) {b=p->a;temp=p;};
p=temp;
temp=head;
head=p;
p=head->link;
head->link=temp->link;
temp->link=p;
for(p=head;p!=NULL;p=p->link)
printf("%d\t",p->a);
system("pause");
return 0;
}

设输入为5,6,7,8,9,10,1,2,3,4
最后的输出是死循环。错误的原因我到是找到了,重点在红色的那一段中,虽然实现了1和5的互换,不过10的指针域还是指向1,所以输出只能是1 6 7 8 9 10 1 6 7……这样循环,而且就目前的代码中我想不出使10的指针域指向5的方法。

话说,这道题是不是要用双链表解决?另外,可以给一个结构体定义两个指针域么?如:
struct node{
int a;
struct node *link1;
struct node *link2;
};
如果可以的话,我就可以让一个指向上一结点,一个指向下一结点了。

不过这种方法还是太繁复,像这道题,限制用链表的情况下,有没有简单一点的解决办法?

搜索更多相关主题的帖子: 链表 node 习题 int 
2007-09-26 23:39
windlzf
Rank: 1
等 级:新手上路
帖 子:56
专家分:0
注 册:2006-8-7
收藏
得分:0 

/*
你就是没有把1的前驱的link指向新换来的10。
我加了一个指针prior记录1的前驱
*/

#include "stdio.h"
#include "alloc.h"

struct node
{
int a;
struct node *link;
};

struct node *head;

int main(void)
{
int i, b;

struct node *p, *p1, *prior, *temp;

for (i = 0;i < 10;i++)
{

p = (struct node *)malloc(sizeof(struct node));

if (p == NULL) return 0;

printf("input the %d number:", i);

scanf("%d",&p->a);

p->link = NULL;

if (i == 0) head = p;
else temp->link = p;

temp = p;
}

b=head->a;
for(p=head;p!=NULL;p1=p,p=p->link)/*增加 p1=p 来记录当前结点的前驱*/
if(b>p->a) {b=p->a;temp=p;prior=p1;}/*prior=p1来记录当前最小值的前驱*/

p=temp;
temp=head;
head=p;
p=head->link;
head->link=temp->link;
temp->link=p;
prior->link=temp;/*最小值原前驱指向换来数*/

for (p = head;p != NULL;p = p->link)
printf("%d\t", p->a);

system("pause");

return 1;
}

2007-09-27 12:58
windlzf
Rank: 1
等 级:新手上路
帖 子:56
专家分:0
注 册:2006-8-7
收藏
得分:0 

/*
你就是没有把1的前驱的link指向新换来的10。
我加了一个指针prior记录1的前驱
*/

#include "stdio.h"
#include "alloc.h"

struct node
{
int a;
struct node *link;
};

struct node *head;

int main(void)
{
int i, b;

struct node *p, *p1, *prior, *temp;

for (i = 0;i < 10;i++)
{

p = (struct node *)malloc(sizeof(struct node));

if (p == NULL) return 0;

printf("input the %d number:", i);

scanf("%d",&p->a);

p->link = NULL;

if (i == 0) head = p;
else temp->link = p;

temp = p;
}

b=head->a;
for(p=head;p!=NULL;p1=p,p=p->link)/*增加 p1=p 来记录当前结点的前驱*/
if(b>p->a) {b=p->a;temp=p;prior=p1;}/*prior=p1来记录当前最小值的前驱*/

p=temp;
temp=head;
head=p;
p=head->link;
head->link=temp->link;
temp->link=p;
prior->link=temp;/*最小值原前驱指向换来数*/

for (p = head;p != NULL;p = p->link)
printf("%d\t", p->a);

system("pause");

return 1;
}

2007-09-27 13:01
lg_mic
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-9-18
收藏
得分:0 
多谢指点,我虽然想到了应该有一个指向前一结点指针,但是却对怎样添加这个指针,这个指针的位置等没有概念。现在看了你的代码后我明白了,像删除某个结点也可以用类似方法解决吧。

2007-09-27 13:17
windlzf
Rank: 1
等 级:新手上路
帖 子:56
专家分:0
注 册:2006-8-7
收藏
得分:0 

差不多类似了,呵呵
你做这个程序,是非要连结点空间都交换吗?如果只是值交换,就不必移动结点了。

2007-09-27 15:18
lg_mic
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-9-18
收藏
得分:0 
回复:(windlzf)差不多类似了,呵呵你做这个程序,是...
原题是这样:输入10个整数,将其中最小的数与第一个数对换,最大的数与最后一个数对换,用链表存放这些整数。
也就是说并没有要求空间交换,我作成空间交换的用意是因为值交换的代码我会写,空间交换的不会,想要学习一下。

对了,删除结点的代码似乎还要考虑到连续删除两个结点、删除结点为头结点或尾结点的状况,似乎也不是那么容易啊。你看看我这个代码
/*习题6.07已知存放一组整数的链表,输入整数n,将存放整数n的所有结点删除。*/
#include<stdio.h>
#include<stdlib.h>
struct node{
int a;
struct node *link;
};
node *head;
int main(void)
{
int i,b,n;
node *p,*p1,*temp;
for(i=0;i<10;i++)
{p=(node *)malloc(sizeof(node));
p->link=NULL;
printf("input the %d number:",i);
scanf("%d",&p->a);
if(i==0){head=p;temp=p;}
else{
temp->link=p;
temp=temp->link;
}
}
printf("input n:");
scanf("%d",&n);
for(p=head;p!=NULL;p1=p,p=p->link)
if(n==p->a){temp=p;p=p1->link=p->link;free (temp);};

for(p=head;p!=NULL;p=p->link)
printf("%d\t",p->a);
system("pause");
return 0;
}

按照你的思路写出来的,一般情况下没问题,不过在连续两个结点的数据相同,或删除首或尾结点的时候会出问题。我想我还得把红色的部分修改一下,貌似要用continue来解决连续n个结点数据相同的问题,用选择语句来解决删除首或尾的问题?

2007-09-27 15:48
快速回复:[求助]书上的习题,链表相关的
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019994 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved