0

以下程序接收表单的输入字符串,ins "name_to_insert" birthdate并应将此信息插入到双向链表中。每次插入后都会显示列表的内容以及元素的数量。元素的数量正在正确显示,但不是名称和出生日期,而是 2686707被显示 n 次(n = 列表中的元素数量)。

我怀疑我的打印函数printList()有问题,但我不知道是什么问题。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "DLList.h"

typedef struct dataStructure
{
    int birthday;
    char *name;
} dataStructure;

int main()
{
    ListT *l=createList();
    char op[4], nameTemp[30], *name, s[50];
    int date;
    while (scanf("%[^\n]%*c", s)==1)
    {
        sscanf(s, "%s", op);
        if (strcmp(op, "ins")==0)
        {
            sscanf(s, "%*s %[^0-9]%d", nameTemp, &date);
            name=nameTemp+1; // Remove opening quotation mark
            name[strlen(name)-2]='\0'; // Remove closing quotation mark
                NodeT *p=createNode();
                p->data=(dataStructure*)malloc(sizeof(dataStructure));
                ((dataStructure*)p->data)->birthday=date;
                ((dataStructure*)p->data)->name=name;
                insertLastNode(l, p);
                printf("List length: %d\n", l->length);
                printList(l);
        }
    }
    return 0;
}

void printList(ListT *l)
{
    NodeT *p=l->first;
    while (p)
    {
        printf("%d %s\n", (((dataStructure*)p->data)->birthday, (dataStructure*)p->data)->name);
        p=p->next;
    }
    printf("--\n");
}

DLList.h的内容:

#include <stdio.h>
#include <stdlib.h>

typedef struct nodetype
{
    struct nodetype *prev, *next;
    void *data;
} NodeT;

typedef struct
{
    int length;
    NodeT *first, *last;
} ListT;

NodeT *createNode();
ListT *createList();
void insertLastNode(ListT *l, NodeT *p);

DLList.c的内容:

#include "DLList.h"

NodeT *createNode()
{
    NodeT *p=(NodeT*)malloc(sizeof(NodeT));
    p->next=p->prev=NULL;
    return p;
}

ListT *createList()
{
    ListT *l=(ListT*)malloc(sizeof(ListT));
    l->first=l->last=NULL;
    l->length=0;
    return l;
}

void insertLastNode(ListT *l, NodeT *p)
{
    if (l->first==NULL)
    {
        l->first=l->last=p;
        p->prev=p->next=NULL;
        l->length++;
    }
    else
    {
        p->prev=l->last;
        p->next=NULL;
        l->last->next=p;
        l->last=p;
        l->length++;
    }
}
4

3 回答 3

1

在您的程序中,您将指针分配给name如下:

((dataStructure*)p->data)->name=name;

此名称源自sscanf以下内容:

sscanf(s, "%*s %[^0-9]%d", nameTemp, &date);
name=nameTemp+1; // Remove opening quotation mark
name[strlen(name)-2]='\0'; // Remove closing quotation mark

这意味着对于循环的每次运行,您都在读取相同的nameTempname数组并将其存储到链表中。对于循环的每次运行,您可能必须分配一个单独的空间来存储name并分配给您的节点。

编辑1:

当您创建一个新节点时,还有一个类型转换问题。p->datavoid *类型,在代码中,我相信,新分配的内存被类型转换dataStructure *如下

p->data=(dataStructure*)malloc(sizeof(dataStructure));

您还可以更改您的数据结构定义如下

typedef struct dataStructure
{
    int birthday;
    char name[64]; // Change from pointer to an array
} dataStructure;

并修改循环中的逻辑以复制名称,如下所示:

p->data=(dataStructure*)malloc(sizeof(dataStructure));
((dataStructure*)p->data)->birthday=date;
strcpy(((dataStructure*)p->data)->name, name); // Modified from pointer assignment to strcpy
于 2013-03-17T13:22:47.590 回答
1

代码中有两个错误。

第一: 代替

((dataStructure*)p->data)->name=name;

((dataStructure*)p->data)->name = (char*)malloc(strlen(name)+1);
strcpy(((dataStructure*)p->data)->name, name);

以避免内存泄漏。

第二 在 printList 函数中,括号有误。执行以下操作:

printf("%d %s\n", ((dataStructure*)p->data)->birthday, ((dataStructure*)p->data)->name);

其他一切都有效。这是我在测试程序时得到的输出。 在此处输入图像描述

于 2013-03-20T10:52:13.793 回答
0

在调试器中运行它以准确查看您的函数在做什么。例如,如果您从 Unix 命令行运行,请使用-g标志编译,然后在gdb. 在困扰您的函数的开头设置断点。谷歌诸如“gdb 备忘单”之类的详细信息,这很容易。

于 2013-03-20T00:30:52.787 回答