C语言实现链表功能输出异常随机值,该如何排查修复代码问题?
问题修复说明
你的代码存在两处核心逻辑错误,直接修改即可解决随机值输出问题:
- 变量名误用:
sonaekle函数内你创建的新节点变量名为sonaeklenecek,但两处赋值操作都错误写为了函数名sonaekle,相当于把函数地址赋值给了链表节点指针,读取sayi字段时拿到的就是非法内存的随机值。 - 尾插逻辑位置错误:给尾部节点的
sonraki赋值的操作被你写在了while循环内部,还没遍历到链表尾部就会提前修改中间节点的后继指针,直接破坏链表结构。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> struct node{ int sayi; struct node* sonraki; }; struct node* baslangic = NULL; struct node* olustur(int sayi){ struct node* yenidugum = (struct node*)malloc(sizeof(struct node)); yenidugum->sayi = sayi; yenidugum->sonraki = NULL; return yenidugum; } void sonaekle(int sayi){ struct node* sonaeklenecek = olustur(sayi); if(baslangic == NULL){ // 修正:把sonaekle改为正确的新节点变量名sonaeklenecek baslangic = sonaeklenecek; } else { struct node* temp = baslangic; while(temp->sonraki != NULL){ temp = temp->sonraki; } // 修正:赋值操作移出循环,同时修改变量名 temp->sonraki = sonaeklenecek; } } void yazdir(){ struct node* temp = baslangic; while(temp != NULL){ printf("%d =>",temp->sayi); temp = temp->sonraki; } } int main() { int secim, sayi; while(1){ printf("1-Sona eleman ekle.....\n"); printf("Yapmak istediginiz secimi yapin...\n"); scanf("%d",&secim); switch(secim){ case 1: printf("Hangi elemani ekleyeceksiniz..\n"); scanf("%d",&sayi); sonaekle(sayi); yazdir(); printf("\n"); // 可选添加,优化输出格式 break; } } return 0; }
内容的提问来源于stack exchange,提问作者Azqaf
相关产品推荐
相关产品推荐

