
vs編譯沒有問題,運行的時候,輸入資料后回車就顯示綠色波浪線這里有沖突,說p1有可能為空,我想知道為什么會有空的情況。我創建2個鏈表,第二個鏈表的頭結點的next接在第一個尾接點,這樣子的鏈表就只有第一個的頭結點,剩下全是2個鏈表合起來的元素,怎么會有NULL的呢,請大佬幫我分析一下。順便再問一個問題,我對動態分配的空間以及NULL這樣子的概念還不是很清楚,比如一個結構體* p=NULL,那這個p所占的空間是原來大小還是變化啦的,動態分配的是類似于結構體定義,結構體里面的成員沒有被賦值,但是卻是一個已經初始化好啦的。這樣子理解對嗎
uj5u.com熱心網友回復:
直接發原始碼吧,不建議發圖片uj5u.com熱心網友回復:
while在做什么?一直再給同一個節點賦值呀uj5u.com熱心網友回復:
#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;
}
這是源代碼
uj5u.com熱心網友回復:
那張圖發錯啦,看代碼吧uj5u.com熱心網友回復:
你那個四連指向同一記憶體位置的操作,可能是原因吧
,總感覺怪怪的
uj5u.com熱心網友回復:
我把它們4個都分開操作啦,最后沒有出現說我p1是NULL啦,但是它輸出第一個和第二個鏈表的最后一個元素后,第三個就輸出不了,錯誤位置還是在那個地方uj5u.com熱心網友回復:
#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;
}
供參考~
樓主的代碼看不出邏輯所在,不申請空間怎么賦值?
uj5u.com熱心網友回復:
你這個malloc只給了一個結點分配了記憶體空間。添加結點要在回圈陳述句里使用malloc分配uj5u.com熱心網友回復:
謝謝大佬指點,我現在給啦他回圈。
#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,就是空的元素。
uj5u.com熱心網友回復:
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;
}
uj5u.com熱心網友回復:
謝謝提醒,但是最后輸出還是有問題,不是這個的原因
uj5u.com熱心網友回復:

改進后的輸出是這樣子的,感覺是把2個鏈表后移一步然后合并在一起,但是我看不出代碼哪里出問題啦
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/52076.html
標籤:C語言
