一个双链表中数据调换位置的问题
//写了个双链表中相邻节点位置调换的问题,出了点错误,输出不对,调试后错误点见代码。#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
struct Node *prior;
}Pnode,*Dlinklist;
Dlinklist creat()
{
Dlinklist p1,p,head;
p=(Dlinklist)malloc(sizeof(Pnode));
p->next=NULL;
p->prior=NULL;
head=p;
p1=p;
printf("请输入数据:");
scanf("%d",&p->data);
while(1)
{
p=(Dlinklist)malloc(sizeof(Pnode));
printf("请输入数据:");
scanf("%d",&p->data);
if(p->data==0)
break;
p1->next=p;
p->prior=p1;
p->next=NULL;
p1=p;
}
return head;
}
Dlinklist exchange(Dlinklist p,int pos)
{
int i=0;
Dlinklist p1;
p1=p;
if(pos<=1)
{
printf("ERROR!!\n");
exit(-1);
}
while(1)
{
i++;
if(i==pos)
{
p1->prior->next=p1->next; //问题出在一下四行,我经过检查没发现问题所在,希望大佬帮忙指正。创建函数没有问题。
p1->next->prior=p1->prior;
p1->next=p1->prior;
p1->prior=p1->prior->prior;
break;
}
else
{
p1=p1->next;
}
}
return p;
}
void print(Dlinklist head)
{
Dlinklist p;
p=head;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
int main()
{
int pos;
Dlinklist head;
head=creat();
printf("1\n\n");
printf("请输入数据:");
scanf("%d",&pos);
printf("3\n\n");
head=exchange(head,pos);
printf("2 \n\n");
print(head);
} 其实双向链表必须能够支持负索引,不然就失去了双向链表的意义。
你只不过是要对调数据,何必改变结构?
int i = 0;
int temp; // 加
if 内部
temp = p1->data;
p1->data = p->data;
p->data = temp;
break;
下面的提示应该是:请输入想要与头节点对调的位置(吧?) claws0n 发表于 2018-9-17 01:07
其实双向链表必须能够支持负索引,不然就失去了双向链表的意义。
你只不过是要对调数据,何必改变结构?
...
因为题目规定的是要用指针方法解决。。。。不让直接教皇数据。。 hhhh还好还好 发表于 2018-9-17 14:40
因为题目规定的是要用指针方法解决。。。。不让直接教皇数据。。
...没事找事做的题目...这个以后要说清楚
s = p1->prior; //需要一个临时指针
s->next = p;
p1->prior = p->prior;
p->prior = s;
p1->prior->next = p1;
s = p1->next;
s->prior = p;
p1->next = p->next;
p->next->prior = p1;
p->next = s;
累...没上机,应该对吧
claws0n 发表于 2018-9-17 15:23
...没事找事做的题目...这个以后要说清楚
s = p1->prior; //需要一个临时指针
s->next = p;
很不好意思,是我的问题,这个问题的要求是交换双链表中p1和p1左边相邻的数据,而且仅可以用指针方法解决。你的代码我认为有错误而且是因我而起,很不好意思。能再看看吗。 claws0n 发表于 2018-9-17 15:23
...没事找事做的题目...这个以后要说清楚
s = p1->prior; //需要一个临时指针
s->next = p;
而且我主要的困惑在于我的代码错在哪里,因为我对这个数据结构比较熟悉了。我的程序输出会将p1节点删除,其他的都没变。例如输入 1,2,3,4,5 删除的位置输入3,输出为1,2,4,5. hhhh还好还好 发表于 2018-9-17 21:43
很不好意思,是我的问题,这个问题的要求是交换双链表中p1和p1左边相邻的数据,而且仅可以用指针方法解决 ...
{:10_247:}1 2 3 4 5 变 1 4 3 2 5? hhhh还好还好 发表于 2018-9-17 21:46
而且我主要的困惑在于我的代码错在哪里,因为我对这个数据结构比较熟悉了。我的程序输出会将p1节点删除, ...
你的没有交接清楚,反而会是删除。确认一下我对题目要求的理解。 hhhh还好还好 发表于 2018-9-17 21:43
很不好意思,是我的问题,这个问题的要求是交换双链表中p1和p1左边相邻的数据,而且仅可以用指针方法解决 ...
s = p1->next ;
p1->next = p1->prior;
s->prior = p1->prior ->prior;
s->prior->next = s;
p1->prior->prior = p1;
p1->prior->next = s->next;
s->next->prior = p1->prior;
p1->prior = s;
s->next = p1; claws0n 发表于 2018-9-17 22:14
1 2 3 4 5 变 1 4 3 2 5?
不,如果是输入1 2 3 4 5,删除第三个的话,输出应该是1 3 2 4 5 hhhh还好还好 发表于 2018-9-18 22:25
不,如果是输入1 2 3 4 5,删除第三个的话,输出应该是1 3 2 4 5
没有删除好不好?还是 5 个元素。
s = p1->prior;
s->next = p1->next;
s->prior->next = p1;
p1->next = s;
p1->prior = s->prior;
s->prior = p1;
s->next->prior = s; claws0n 发表于 2018-9-18 23:50
没有删除好不好?还是 5 个元素。
s = p1->prior;
s->next = p1->next;
感谢!!!
页:
[1]