鱼C论坛

 找回密码
 立即注册
查看: 2103|回复: 11

[已解决]一个双链表中数据调换位置的问题

[复制链接]
发表于 2018-9-17 00:36:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
//写了个双链表中相邻节点位置调换的问题,出了点错误,输出不对,调试后错误点见代码。



#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);
}
最佳答案
2018-9-18 23:50:16
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;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-17 01:07:27 From FishC Mobile | 显示全部楼层
其实双向链表必须能够支持负索引,不然就失去了双向链表的意义。
你只不过是要对调数据,何必改变结构?
int i = 0;
int temp; // 加
if 内部
temp = p1->data;
p1->data = p->data;
p->data = temp;
break;

下面的提示应该是:请输入想要与头节点对调的位置(吧?)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-17 14:40:13 | 显示全部楼层
claws0n 发表于 2018-9-17 01:07
其实双向链表必须能够支持负索引,不然就失去了双向链表的意义。
你只不过是要对调数据,何必改变结构?
...

因为题目规定的是要用指针方法解决。。。。不让直接教皇数据。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-17 15:23:23 From FishC Mobile | 显示全部楼层
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;
累...没上机,应该对吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-17 21:43:25 | 显示全部楼层
claws0n 发表于 2018-9-17 15:23
...没事找事做的题目...这个以后要说清楚
s = p1->prior; //需要一个临时指针
s->next = p;

很不好意思,是我的问题,这个问题的要求是交换双链表中p1和p1左边相邻的数据,而且仅可以用指针方法解决。你的代码我认为有错误而且是因我而起,很不好意思。能再看看吗。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-17 21:46:10 | 显示全部楼层
claws0n 发表于 2018-9-17 15:23
...没事找事做的题目...这个以后要说清楚
s = p1->prior; //需要一个临时指针
s->next = p;

而且我主要的困惑在于我的代码错在哪里,因为我对这个数据结构比较熟悉了。我的程序输出会将p1节点删除,其他的都没变。例如输入 1,2,3,4,5   删除的位置输入3,输出为1,2,4,5.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-17 22:14:57 | 显示全部楼层
hhhh还好还好 发表于 2018-9-17 21:43
很不好意思,是我的问题,这个问题的要求是交换双链表中p1和p1左边相邻的数据,而且仅可以用指针方法解决 ...

  1 2 3 4 5 变 1 4 3 2 5?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-17 23:41:34 | 显示全部楼层
hhhh还好还好 发表于 2018-9-17 21:46
而且我主要的困惑在于我的代码错在哪里,因为我对这个数据结构比较熟悉了。我的程序输出会将p1节点删除, ...

你的没有交接清楚,反而会是删除。确认一下我对题目要求的理解。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-18 00:02:01 | 显示全部楼层
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;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-18 22:25:55 | 显示全部楼层
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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-18 23:50:16 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
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;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-19 22:57:02 | 显示全部楼层
claws0n 发表于 2018-9-18 23:50
没有删除好不好?还是 5 个元素。
s = p1->prior;
s->next = p1->next;

感谢!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 12:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表