0

所以我有一个自制的双链表实现,它被用作排队器的替代品。(用 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

这是一个错误,因为所需的输出是 OUTPUT: Gin 10 Vodka 20 Rum 30

我感觉这与字符串如何传递到节点有关,但正如您所看到的,我很难过。这是任务中剩下的最后一件事,其他一切都运行良好,所以我决定在这里询问是否有人可以推动我走上正确的道路。提前感谢您的帮助:)

PS对不起,一切都不好,我睡眠不足:(

4

1 回答 1

3

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

tail->name = strdup(name);

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

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

tail->name = malloc(strlen(name) + 1);
strcpy(tail->name, name);
  • 不要忘记检查错误
  • 不要free在某个时候忘记记忆
于 2012-08-26T15:47:51.887 回答