这道题,用链表来做是不是有点困难?
以下是我试做的部分
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;
};
如果可以的话,我就可以让一个指向上一结点,一个指向下一结点了。
不过这种方法还是太繁复,像这道题,限制用链表的情况下,有没有简单一点的解决办法?