有大佬知道这个是什么问题吗

兔无双 2020-06-03 09:37:46

vs编译没有问题,运行的时候,输入数据后回车就显示绿色波浪线这里有冲突,说p1有可能为空,我想知道为什么会有空的情况。我创建2个链表,第二个链表的头结点的next接在第一个尾接点,这样子的链表就只有第一个的头结点,剩下全是2个链表合起来的元素,怎么会有NULL的呢,请大佬帮我分析一下。顺便再问一个问题,我对动态分配的空间以及NULL这样子的概念还不是很清楚,比如一个结构体* p=NULL,那这个p所占的空间是原来大小还是变化啦的,动态分配的是类似于结构体定义,结构体里面的成员没有被赋值,但是却是一个已经初始化好啦的。这样子理解对吗
...全文
146 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
兔无双 2020-06-03
  • 打赏
  • 举报
回复
引用 8 楼 chxchxkkk 的回复:
你这个malloc只给了一个结点分配了内存空间。添加结点要在循环语句里使用malloc分配
谢谢大佬指点,我现在给啦他循环。 #include<stdio.h> #include<stdlib.h> #include<string.h> #pragma warning(disable:4996) typedef struct stu { int num; int score; struct stu* next; }student; int main() { int m, n; scanf("%d %d", &m, &n); int x = m; int y = n; student* p1; student* p2; student* head1 = (student*)malloc(sizeof(student)); student* list1 = (student*)malloc(sizeof(student)); student* head2 = (student*)malloc(sizeof(student)); student* list2 = (student*)malloc(sizeof(student)); p1 = head1; p2 = head2; for (int i = 0;i < m;i++) { scanf("%d %d", &list1->num, &list1->score); list1 = (student*)malloc(sizeof(student)); p1->next = list1; p1 = list1; } list1->next = NULL; //第一个链表尾结点的next是NULL p1 = head1; //p1重新指向头结点 for (int i = 0;i < n;i++) { scanf("%d %d", &list2->num, &list2->score); list2 = (student*)malloc(sizeof(student)); p2->next = list2; p2 = list2; } list2->next = NULL; //第二个链表尾结点的next是NULL p2 = head2->next; //p2指向头结点的next,即第一个元素 list1->next = p2; //第一个链表的尾结点的next是第二个链表的第一个元素,这时候合起来的链表应该是只有一个头结点,其他是x+y个元素,最后一个结点的next是NULL printf("\n\n\n"); int sum = x+y; while(sum--) { p1 = p1->next; printf("%d %d\n", p1->num, p1->score); //p1从头结点开始循环,输出各个元素的成员的值 } return 0; } 之前的问题都解决啦,我把我刚才的做啦修改,但是最后输出的时候,它输出少啦2个链表的第一个元素,然后多了2个链表尾结点的next,就是空的元素。
chxchxkkk 2020-06-03
  • 打赏
  • 举报
回复
你这个malloc只给了一个结点分配了内存空间。添加结点要在循环语句里使用malloc分配
自信男孩 2020-06-03
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)
typedef struct stu
{
int num;
int score;
struct stu* next;
}student;


void create_link(student **pphead, int num)
{
student *pcur, *pnext;
int i = 0;

while (i < num) {
pcur = (student *)malloc(sizeof(student));
if (!pcur)
exit(0);
scanf("%d %d", &pcur->num, &pcur->score);
if (!*pphead) {
*pphead = pcur;
pnext = *pphead;
i++;
continue;
}
pnext->next = pcur;
pnext = pcur;
i++;
}
pnext->next = NULL;
}

void print_link(student *phead)
{
student *pcur = phead;

while (pcur) {
printf("%d %d\n", pcur->num, pcur->score);
pcur = pcur->next;
}
}

int main()
{
int m, n, y;

student *head1, *head2, *pcur;

head1 = head2 = NULL;

scanf("%d %d", &m, &n);
create_link(&head1, m);
//print_link(head1);
create_link(&head2, n);
//print_link(head2);

y = m + n;

pcur = head1;
while (pcur && pcur->next)
pcur = pcur->next;

pcur->next = head2;


print_link(head1);


#if 0
student* head1, * list1, * head2, * list2, * p1, * p2;
head1 = list1 = head2 = list2 = (student*)malloc(sizeof(student));
if (!head1)
exit(0);
p1 = head1;
p2 = head2;
p1->next = NULL;
while(m--) {
scanf("%d %d", &list1->num, &list1->score);
list1->next = NULL;
p1->next = list1;
p1 = list1;
list1 = (student*)malloc(sizeof(student));
if (!list1)
exit(0);
}
free(list1); //最后一个list1没有执行scanf

p2 = head1;
list2 = (student*)malloc(sizeof(student));
if (!list2)
exit(0);
while (n--) {
scanf("%d %d", &list2->num, &list2->score);
list2->next = p2->next;
p2->next = list2;
p2 = list2;
list2 = (student*)malloc(sizeof(student));
if (!list2)
exit(0);
}
free(list2); //最后一个list1没有执行scanf
/*
p2 = head2->next;
list1->next = p2;
*/
p1 = head1;
int y = m + n;
while(y--)
{
printf("%d %d", p1->num, p1->score);
p1 = p1->next;
}
#endif
return 0;
}

供参考~


楼主的代码看不出逻辑所在,不申请空间怎么赋值?
兔无双 2020-06-03
  • 打赏
  • 举报
回复
我把它们4个都分开操作啦,最后没有出现说我p1是NULL啦,但是它输出第一个和第二个链表的最后一个元素后,第三个就输出不了,错误位置还是在那个地方
无敌大堡礁 2020-06-03
  • 打赏
  • 举报
回复
你那个四连指向同一内存位置的操作,可能是原因吧,总感觉怪怪的
兔无双 2020-06-03
  • 打赏
  • 举报
回复
那张图发错啦,看代码吧
兔无双 2020-06-03
  • 打赏
  • 举报
回复
#include<stdio.h> #include<stdlib.h> #pragma warning(disable:4996) typedef struct stu { int num; int score; struct stu* next; }student; int main() { int m, n; scanf("%d %d", &m, &n); student* head1, * list1, * head2, * list2, * p1, * p2; head1 = list1 = head2 = list2 = (student*)malloc(sizeof(student)); p1 = head1; p2 = head2; while(m--) { scanf("%d %d", &list1->num, &list1->score); p1->next = list1; list1->next = NULL; p1 = list1; } p1 = head1; while (n--) { scanf("%d %d", &list2->num, &list2->score); p2->next = list2; list2->next = NULL; p2 = list2; } p2 = head2->next; list1->next = p2; int y = m + n; while(y--) { p1 = p1->next; printf("%d %d", p1->num, p1->score); } return 0; } 这是源代码
自信男孩 2020-06-03
  • 打赏
  • 举报
回复
while在做什么?一直再给同一个节点赋值呀
自信男孩 2020-06-03
  • 打赏
  • 举报
回复
直接发源码吧,不建议发图片
兔无双 2020-06-03
  • 打赏
  • 举报
回复
改进后的输出是这样子的,感觉是把2个链表后移一步然后合并在一起,但是我看不出代码哪里出问题啦
兔无双 2020-06-03
  • 打赏
  • 举报
回复
引用 10 楼 chxchxkkk 的回复:
while(sum--) { p1 = p1->next; printf("%d %d\n", p1->num, p1->score); //p1从头结点开始循环,输出各个元素的成员的值 } 一般输出链表这样: while(p1->next != NULL) { printf("%d %d\n", p1->num, p1->score); //p1从头结点开始循环,输出各个元素的成员的值 p1 = p1->next; }
谢谢提醒,但是最后输出还是有问题,不是这个的原因
chxchxkkk 2020-06-03
  • 打赏
  • 举报
回复
while(sum--) { p1 = p1->next; printf("%d %d\n", p1->num, p1->score); //p1从头结点开始循环,输出各个元素的成员的值 } 一般输出链表这样: while(p1->next != NULL) { printf("%d %d\n", p1->num, p1->score); //p1从头结点开始循环,输出各个元素的成员的值 p1 = p1->next; }

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧