gpt4 book ai didi

c - 节点,按值传递,C 中奇怪的字符串行为

转载 作者:太空宇宙 更新时间:2023-11-04 07:32:42 26 4
gpt4 key购买 nike

所以我有一个自制的双链表实现,用作排队器的替代品。 (用 C 语言实现,这是我公认的弱项)。

节点的类型定义:

typedef struct Node
{
char *name;
int data;
int recurring;
struct Node *next;
struct Node *prev;
}node;

表示“一个节点有一个名称、一个数据点、是否重复出现以及指向上一个和下一个节点的指针”

这样的插入函数

node * insertFromTail(node *tail, int data, int recurring, char *name)
{
node *newNode;
node *oldNext;
node *origTail = tail;
/*assume *pointer points to tail of list*/
/*printf("tail data is %d\n", tail->data);
printf("before loop\n");*/
while(tail->prev != NULL && tail->data > data)
{
/*printf("inside while loop\n");*/
tail = tail -> prev;
}
/*printf("after loop\n");*/
/*if we are looking at a no item list or tail*/
if(tail->next == NULL)
{
/*printf("pointer is tail\n");*/
return insert(tail, data, recurring, name);
}
else /*tail pointer points at item before the point of insertion*/
{
/*printf("default case\n");
printf("pointer data is %d\n", tail->data);*/
oldNext = tail->next;
newNode = (node *)malloc(sizeof(node));
newNode->data = data;
newNode->recurring = recurring;
newNode->name = name;
oldNext -> prev = newNode;
newNode -> next = oldNext;
tail -> next = newNode;
newNode -> prev = tail;
return origTail;
}
}

内部插入

node * insert(node *tail, int data, int recurring, char *name)
{
/* Allocate memory for the new node and put data in it.*/
tail->next = (node *)malloc(sizeof(node));
(tail->next)->prev = tail;
tail = tail->next;
tail->data = data;
tail->recurring = recurring;
tail->name = name;
tail->next = NULL;
return tail;
}

传递列表的尾部、数据点、下一个项目将出现的时间以及项目的名称。

如果我们从一个空的节点开始,并且有 NULL prev 和 next 引用(一个虚拟节点),我添加了三个唯一的节点,一个名为 ADD 的函数调用 insertFromTail 从 stdIn 获取输入

int main()
{
node *start,*temp,*tail;
start = (node *)malloc(sizeof(node));
temp = start = tail;
temp->next = NULL;
temp->prev = NULL;
if(strcmp(command, "ADD") == 0)
{
scanf("%d",&argTime);
scanf("%s",&argName);
tail = insertFromTail(head, argTime, 0, *argName);
}
}

这样输入:

INPUT: 
ADD 10 Gin
ADD 20 Vodka
ADD 30 Rum
PRINT

我会得到输出

OUTPUT:
Rum 10
Rum 20
Rum 30

这是一个错误,因为期望的输出是 输出: Gin 10 伏特加 20 朗姆酒 30

我觉得这与字符串传递到节点的方式有关,但如您所见,我很困惑。这是任务中剩下的最后一件事,其他一切都运行良好,所以我决定在这里问问是否有人可以在正确的道路上插入我。提前感谢您的帮助:)

附言抱歉,一切都不好,我 sleep 不足:(

最佳答案

简短回答:您需要复制该名称:

tail->name = strdup(name);

更长的答案:在每次迭代中,您都存储相同的指针。您正在存储它,然后下次您再次写入它时。因此,您最终会得到 3 个相同的指针,指向您最后输入的任何内容。

一个简单的修复方法是复制字符串并存储一个副本:正是 strdup 所做的。但是,如果您的实现缺少 strdup,您可以尝试:

tail->name = malloc(strlen(name) + 1);
strcpy(tail->name, name);
  • 不要忘记检查错误
  • 不要忘记在某个时候释放内存

关于c - 节点,按值传递,C 中奇怪的字符串行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12131481/

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