gpt4 book ai didi

代码不打印链表 C

转载 作者:太空宇宙 更新时间:2023-11-04 03:49:29 25 4
gpt4 key购买 nike

我正在编写 C 代码来实现链表。但是在打印列表的内容时,它只打印最后一个节点的值。我已经调试了很长时间。请帮忙。

#include <stdio.h>
#include <malloc.h>

struct list {
char *name;
char *type;
int occurance;
struct list *prev;
struct list *link;
};

struct list *start=NULL,*ptr,*newnode;

void main() {
int choice = 0;
char name1[10], type1[10];
int occ;

do {
printf("Enter name:");
scanf("%s", name1);
printf("Enter type:");
scanf("%s", type1);
printf("Enter occurance:");
scanf("%d", &occ);
newnode = (struct list *)malloc(sizeof(struct list));
newnode->link = NULL;
newnode->prev = NULL;
newnode->name = name1;
newnode->type = type1;
newnode->occurance = occ;
if(newnode == NULL) {
printf("Memory could not be allocated!");
// exit(0);
}
if(start == NULL) {
start = newnode;
ptr = start;
printf("start is: %s", start->name);
}
else if(start->link == NULL) {
start->link = newnode;
newnode->prev = start;
ptr = newnode;
}
else {
ptr->link = newnode;
newnode->prev = ptr;
ptr = ptr->link;
}
printf("Enter 1 to continue: ");
scanf("%d", &choice);
} while(choice == 1);

// display
ptr = start;
while(ptr != NULL) {
printf("%s ", ptr->name);
printf("%s ", ptr->type);
printf("%d \n", ptr->occurance);
ptr = ptr->link;
}
}

我也试过制作 start 和 newnode 局部变量,但它不起作用。

最佳答案

您不能使用等于运算符来分配 char *。相反,您必须使用函数 strcpy

不要这样做:

newnode->name=name1;
newnode->type=type1;

但是这样做:

strcpy(newnode->name, name1);
strcpy(newnode->type, type1);

目前你的整个 char* 都指向同一个内存块。

编辑:由于您使用的是指针,因此必须在将值从一个指针复制到另一个指针之前分配内存(否则您会遇到段错误)。因此,您还需要使用 malloc 分配节点的名称和类型内存:

//allocate memory of node's name attribute with the same amount as name1 (+1 for null terminating character)
newnode->name = malloc(sizeof(char) * (strlen(name1)+1));
newnode->type= malloc(sizeof(char) * (strlen(type1)+1));

关于代码不打印链表 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21886062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com