You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:55:25