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

これは、ループを実行するたびに、同じ配列nameTempまたはname配列を読み取り、リンクリストに同じものを格納していることを意味します。ループを実行するたびに、を格納するための個別のスペースをname割り当て、ノードに同じスペースを割り当てる必要がある場合があります。

編集1:

新しいノードを作成する場合、型キャストの問題も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

コードに 2 つのエラーがあります。

最初: 代わりに

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

行う

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

メモリリークを避けるために。

2番目 の printList 関数で、括弧に誤りがありました。以下のようにします。

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

他のすべてが機能します。プログラムをテストしたときに得た出力を次に示します。 ここに画像の説明を入力

于 2013-03-20T10:52:13.793 に答える
0

これをデバッガーで実行して、関数が何をしているかを正確に確認してください。たとえば、Unix コマンド ラインから実行している場合は、-gフラグを指定してコンパイルし、 gdb. 気になる関数の先頭にブレークポイントを設定します。詳細については、「gdbチートシート」などをGoogleで検索してください。簡単です。

于 2013-03-20T00:30:52.787 に答える