C语言循环链表打印异常:仅显示性别字段,姓名字段缺失
循环链表姓名不显示的问题修复方案
核心问题及修复点
- 姓名输入错误:main函数中输入姓名时,
scanf("%s", &name);错误使用了&name,数组名name本身就是指向首元素的指针,无需取地址,修正为scanf("%s", name);,确保姓名正确写入数组。 - 性别数组长度不足:
char gender[1];无法容纳字符串结束符\0,strcpy会越界写入破坏内存,修正为char gender[2];,预留结束符空间。 - 字符串比较逻辑错误:
deleteberdasarisi函数中用==比较字符串是对比指针地址,而非内容,改用strcmp函数判断字符串是否相等(strcmp返回0表示相等)。 - 单节点删除时指针未初始化:
deleteberdasarlokasi函数中,链表仅一个节点时current未初始化就执行free,修正为直接操作tail并释放。
修改后的完整代码
#include<stdio.h> #include<stdlib.h> #include<string.h> struct node { char nama[20]; char jk[2]; struct node *next; }; typedef struct node NODE; NODE *buatnodebaru(char a[20], char b[2]){ NODE * nodebaru = (NODE *) malloc (sizeof(NODE)); strcpy(nodebaru -> nama, a); strcpy(nodebaru -> jk , b); return nodebaru; } void print(NODE * tail){ NODE *current = tail; if (tail != NULL) { do { current = current -> next; printf(" %s (%s) -> ", current->nama, current->jk); } while (current != tail); } system("pause"); system("CLS"); } int panjang(NODE * tail) { NODE * current = tail; int i = 1; if (tail == NULL) { return 0; } else { current = current -> next; while (current != tail) { i++; current = current -> next; } } return i; } NODE *insertawal(NODE * tail, char a[20], char b[2]) { NODE * nodebaru = buatnodebaru(a,b); if (tail == NULL) { tail = nodebaru; nodebaru -> next = nodebaru; } else { nodebaru -> next = tail -> next; tail -> next = nodebaru; } return tail; system("pause"); system("CLS"); } NODE * insertakhir(NODE * tail, char a[20], char b[2]) { return insertawal(tail, a, b) -> next; } NODE * insertsetelah(NODE * tail, char a[20], char b[2], int location) { int len = panjang(tail), i; if (location < 1 || location > len + 1) { printf("\nInvalid location to enter data\n"); } else { if (tail == NULL) return insertawal(tail, a, b); NODE * nodebaru = buatnodebaru(a,b), * current = tail; for (i = 1; i != location; i++) current = current -> next; nodebaru -> next = current -> next; current -> next = nodebaru; if (location == len + 1) tail = nodebaru; print(tail); } return tail; system("pause"); system("CLS"); } NODE * deleteberdasarisi(NODE * tail, char a[20], char b[2]) { NODE * current = tail, * previous; if (tail == NULL) return tail; else if (tail == tail -> next) { if (strcmp(tail -> nama, a) == 0 && strcmp(tail -> jk, b) == 0 ) { free(tail); tail = NULL; } return tail; } do { previous = current; current = current -> next; if (strcmp(current -> nama, a) == 0 && strcmp(current -> jk, b) == 0) { previous -> next = current -> next; if (current == tail) tail = previous; free(current); current = previous -> next; } } while (current != tail); return tail; system("pause"); system("CLS"); } NODE * deleteberdasarlokasi(NODE * tail, int location) { NODE * current, * previous = tail; int len = panjang(tail), i; if (location < 1 || location > len) { printf("Invalid Location to delete"); } else if (len == 1) { free(tail); tail = NULL; } else { current = tail -> next; for (i = 1; i < location; i++) { previous = current; current = current -> next; } previous -> next = current -> next; if (current == tail) tail = previous; free(current); } return tail; system("pause"); system("CLS"); } int main (){ NODE * cll = NULL; int pilihan; while(1) { printf(" PROGRAM LINKED LIST\n"); printf(" ================================\n"); printf(" 1. Memasukkan data di awal\n"); printf(" 2. Memasukkan data akhir (ekor) \n"); printf(" 3. Memasukkan data setelah \n "); printf(" 4. Menghapus data berdasar isi\n"); printf(" 5. Menghapus data berdasar lokasi\n"); printf(" 6. Keluar\n"); printf(" ================================\n"); printf(" Masukkan Pilihan Anda : "); scanf("%d", &pilihan); if (pilihan==1) { char name[20]; char gender[2]; printf("\n Masukkan nama : "); scanf("%s", name); printf("\n Masukkan jk : "); scanf("%s", gender); cll = insertawal(cll, name, gender); print(cll); } else if (pilihan==2) { char name[20]; char gender[2]; printf("\n Masukkan nama : "); scanf("%s", name); printf("\n Masukkan jk : "); scanf("%s", gender); cll = insertakhir(cll, name, gender); print(cll); } else if (pilihan==3) { char name[20]; char gender[2]; int location; printf("\n Masukkan nama : "); scanf("%s", name); printf("\n Masukkan jk : "); scanf("%s", gender); printf("\n setelah elemen yang mana data akan dimasukkan : "); scanf("%d", &location); cll = insertsetelah(cll, name, gender, location); print(cll); } else if(pilihan==4) { char name[20]; char gender[2]; printf("\n Masukkan nama : "); scanf("%s", name); printf("\n Masukkan jk : "); scanf("%s", gender); cll = deleteberdasarisi(cll, name, gender); print(cll); } else if(pilihan==5) { int dell; printf("\n Masukkan lokasi yang akan di delete : "); scanf("%d", &dell); cll = deleteberdasarlokasi(cll, dell); print(cll); } else if(pilihan==6) { return 0; } else { return 0; } } return 0; }
内容的提问来源于stack exchange,提问作者awraaa
相关产品推荐
相关产品推荐

