正文
今天寫作業(yè)代碼,遇到一些小問題双妨,記錄一下解決過程酿联。
先貼出最早的問題代碼
// linklist.c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node* next;
} node, *Node;
int main() {
Node head = NULL, tail = NULL, p_new = NULL;
int temp;
while((scanf("%d", &temp) != EOF) && getchar() != '\n') {
p_new = (Node)malloc(sizeof(node));
p_new->data = temp;
if(head == NULL)
{
head = p_new;
tail = p_new;
}
tail->next = p_new;
tail = p_new;
}
Node max = head, p = head;
while(p != NULL) {
if(p->data > max->data) {
max = p;
}
p = p->next;
}
p = head;
while(p != NULL && p->next != max) {
p = p->next;
}
p->next = max->next;
max->next = NULL;
tail->next = max;
p = head;
while(p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
return 0;
}
從控制臺(tái)輸入一組數(shù)據(jù)(不定量),每輸入一個(gè)就插入鏈表尾部扮饶,輸入完成后找到最大節(jié)點(diǎn)并將最大節(jié)點(diǎn)移動(dòng)到鏈表尾部
但是在測(cè)試的時(shí)候發(fā)現(xiàn)不對(duì)勁具练,出現(xiàn)了無(wú)限循環(huán)
經(jīng)過一系列排查乍构,發(fā)現(xiàn)是因?yàn)槌霈F(xiàn)了野指針甜无!
在第15行,只給p_new->data
賦值哥遮,沒有給p_new->next
賦值岂丘,p_new->next
成為野指針,而在后面第26行等判斷指針不為NULL
的語(yǔ)句始終為真眠饮,導(dǎo)致無(wú)限循環(huán)
所以修改方案就是在第15行后面添加一行p_new->next = NULL;
這一點(diǎn)修改之后奥帘,做測(cè)試,發(fā)現(xiàn)始終都不會(huì)打印出鏈表最后一個(gè)值
可以看到2沒有了
這就讓我思考仪召,難道是鏈表操作有誤寨蹋?
在經(jīng)過一系列排查之后,再次找到問題所在
第13行輸入判斷條件有誤扔茅,getchar() != '\n'
已旧,前面的字符后都是空格' '
,但最后一個(gè)數(shù)后面的字符是'\n'
召娜,于是表達(dá)式為假运褪,于是就沒有后面的循環(huán)了,最后一個(gè)數(shù)也自然沒加進(jìn)鏈表
改進(jìn)方法就是將循環(huán)改成下面這樣
while(scanf("%d", &temp)) {
p_new = (Node)malloc(sizeof(node));
p_new->data = temp;
p_new->next = NULL;
if(head == NULL)
{
head = p_new;
tail = p_new;
}
tail->next = p_new;
tail = p_new;
if(getchar() == '\n') {
break;
}
}
這樣就不會(huì)有問題啦
一切正常
所以這次問題小記就到這里啦