首页 新闻 会员 周边

关于c语言链表的一些问题

0
悬赏园豆:10 [已解决问题] 解决于 2021-10-04 19:14

LinkList* changeList(LinkList* L) {
LinkList* pl,pre,p, *q;
if (L->next == NULL) {
printf("该链表为空");
}
pl = L->next;
pre = pl;
p = pl->next;
while (p != NULL) {
q = p->next;
if (p->data >= pl->data) {
pre = p;
p = q;
}
else {
//断掉所需前移节点的前驱链
pre->next = p->next;
p->next = L->next;
L->next = p;
p = q;
}
}
return L;
}
这个方法是实现,将值小于第一个元素的节点放在第一个节点之前,大于的不变,仍在之后,我总感觉pre指针是不是有点多余了,感觉只需要三个指针就够了

新手小白。的主页 新手小白。 | 初学一级 | 园豆:75
提问于:2021-10-04 16:28
< >
分享
最佳答案
0

代码测试过吗, p不是个指针吧, 还是是你排版问题?

while (p != NULL) {
收获园豆:10
jakio6 | 小虾三级 |园豆:1318 | 2021-10-04 17:03

应该是排版问题,pre,p都是指针

新手小白。 | 园豆:75 (初学一级) | 2021-10-04 17:05

@新手小白。: 你这代码写的有问题

while (p != NULL) {
        q = p->next;
jakio6 | 园豆:1318 (小虾三级) | 2021-10-04 17:45

@jakio6: 这块为啥有问题

新手小白。 | 园豆:75 (初学一级) | 2021-10-04 17:52

@新手小白。: 不好意思是我有问题 😦 吐了

jakio6 | 园豆:1318 (小虾三级) | 2021-10-04 17:53

@jakio6: 我总感觉Pre这个指针没啥用,但是书上是这样写的,所以不太理解

新手小白。 | 园豆:75 (初学一级) | 2021-10-04 17:54

@新手小白。: q可以去掉.

jakio6 | 园豆:1318 (小虾三级) | 2021-10-04 17:54

@jakio6: q不是防止这个链断的吗,把p拆下来时,p后面的链不是就断了,还是pre是防止链断的

新手小白。 | 园豆:75 (初学一级) | 2021-10-04 17:56

@新手小白。:
有这个不是

pre->next = p->next;
jakio6 | 园豆:1318 (小虾三级) | 2021-10-04 17:58

@jakio6: 这个是不就是跨过p当前指向的节点,跟他后面的那些节点连起来,防止链断

新手小白。 | 园豆:75 (初学一级) | 2021-10-04 17:59

@新手小白。: 什么意思

jakio6 | 园豆:1318 (小虾三级) | 2021-10-04 18:02

@jakio6: 他这个pre是不是就是连接上p这个节点的下一个节点

新手小白。 | 园豆:75 (初学一级) | 2021-10-04 18:03

@新手小白。: 你是说这个语句还是pre这个变量的作用?

jakio6 | 园豆:1318 (小虾三级) | 2021-10-04 18:07

@jakio6: pre这个指针的作用

新手小白。 | 园豆:75 (初学一级) | 2021-10-04 18:09

@新手小白。: pre是为了能够移除p

jakio6 | 园豆:1318 (小虾三级) | 2021-10-04 18:13

@jakio6: 没太懂。。。

新手小白。 | 园豆:75 (初学一级) | 2021-10-04 18:15

@新手小白。: 要个链表一个节点移除掉得要能访问到这个节点前一个节点的next

jakio6 | 园豆:1318 (小虾三级) | 2021-10-04 18:17

@jakio6: 懂了,原来是这个意思,那q节点的作用是不是为了让p节点移动

新手小白。 | 园豆:75 (初学一级) | 2021-10-04 18:18

@新手小白。: q没用

jakio6 | 园豆:1318 (小虾三级) | 2021-10-04 18:19

@jakio6: 那如何让p节点向后移动

新手小白。 | 园豆:75 (初学一级) | 2021-10-04 18:22

@新手小白。: p是个指针, p = pre->next就行了

jakio6 | 园豆:1318 (小虾三级) | 2021-10-04 18:24

@jakio6: LinkList* changeList(LinkList* L) {
LinkList* pl,pre,p;
if (L->next == NULL) {
printf("该链表为空");
}
pl = L->next;
pre = pl;
p = pl->next;
while (p != NULL) {
if (p->data >= pl->data) {
pre = p;
p = pre->next;
}
else {
//断掉所需前移节点的前驱链
pre->next = p->next;
p->next = L->next;
L->next = p;
p = pre->next;
}
}
return L;
}
改完之后,这个就陷入死循环了

新手小白。 | 园豆:75 (初学一级) | 2021-10-04 18:27

@新手小白。: 不应该啊, 这个和之前那个应该是等价的

jakio6 | 园豆:1318 (小虾三级) | 2021-10-04 18:37

@jakio6: 我也觉得没啥问题,但是一运行就这样了

新手小白。 | 园豆:75 (初学一级) | 2021-10-04 18:37

@新手小白。: 你测试的代码是不是不一样, 不然要是在这个函数里死循环哪里来的输出

jakio6 | 园豆:1318 (小虾三级) | 2021-10-04 18:38

@jakio6: 我也不太懂,我输入的3 2 1,然后就这样了。。。

新手小白。 | 园豆:75 (初学一级) | 2021-10-04 18:39

@新手小白。: 没改之前没有问题吗?

jakio6 | 园豆:1318 (小虾三级) | 2021-10-04 18:42

@jakio6: 没问题,都正常

新手小白。 | 园豆:75 (初学一级) | 2021-10-04 18:44

@新手小白。: 改回去试下

jakio6 | 园豆:1318 (小虾三级) | 2021-10-04 18:45

@jakio6: 我的问题,运行成我写的一个错误方法了。。。不好意思。你那个没有任何问题

新手小白。 | 园豆:75 (初学一级) | 2021-10-04 18:51

@新手小白。: 😃

jakio6 | 园豆:1318 (小虾三级) | 2021-10-04 18:52

@jakio6: 实在抱歉,我在问最后一个问题,实在麻烦你了

新手小白。 | 园豆:75 (初学一级) | 2021-10-04 18:53

@jakio6: //逆置方法
void ReverseList(LinkList* L) {
LinkList* p, * q;
p = L->next;
L->next = NULL;
while (p!= NULL) {
q = p->next;
p->next = L->next;
L->next = p;
p = q;
}
}
我这个方法要实现的把这个链表逆置,本质也是删掉节点,前插,为何这个不需要找前驱节点

新手小白。 | 园豆:75 (初学一级) | 2021-10-04 18:54

@新手小白。: 这个只用删

jakio6 | 园豆:1318 (小虾三级) | 2021-10-04 18:57

@新手小白。: 一直是移除第一个节点

jakio6 | 园豆:1318 (小虾三级) | 2021-10-04 18:59

@jakio6: 懂了。真的万分感谢!!!

新手小白。 | 园豆:75 (初学一级) | 2021-10-04 19:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册