簡體   English   中英

如何將結構添加到鏈表? 在 C

[英]How to add a structure to a linked list? in C

我正在嘗試將一個框架添加到此類結構的鏈表中,但不是每次都向列表中添加一個新結構,程序沒有添加任何內容,誰能告訴我問題是什么? 或者給我一個更好的鍛煉方法?

結構:

typedef struct Frame
{
    char* name;
    int duration;
    char* path;

} Frame;


// Link (node) struct
typedef struct FrameNode
{
    Frame* frame;
    struct FrameNode* next;
} FrameNode;

功能:

FrameNode* addFrame(Frame* frame)
{
    char name[100] = { 0 };
    char path[100] = { 0 };
    int dur = 0;
    Frame* p = (Frame*)malloc(sizeof(Frame));

    printf("*** Creating a new frame ***\n");
    printf("Please insert frame path:\n");
    fgets(path, 100, stdin);
    path[strcspn(path, "\n")] = 0;
    strcpy(p->path, path);

    printf("Please insert frame duration <in miliseconds>:\n");
    scanf("%d", &dur);
    getchar();
    p->duration = dur;

    printf("Please chooce a name for a new frame:\n");
    fgets(name, 100, stdin);
    name[strcspn(name, "\n")] = 0;
    strcpy(p->name, name);
    while (list != NULL)
    {
        if (strcmp(list->frame->name, p->name) == 0)
        {
            printf("The name is already taken, Please enter another name\n");
            fgets(name, 100, stdin);
            name[strcspn(name, "\n")] = 0;
            strcpy(p->name, name);
        }
        list = list->next;
    }
    free(p);
    return p;
}

FrameNode* insertAtEnd(FrameNode** list, Frame* fr)
{
    if (*list)
    {
        FrameNode* help = *list;
        FrameNode* tmp = (FrameNode*)malloc(sizeof(FrameNode));
        tmp->frame = addFrame(fr);
        while (help->next != NULL)
        {
            help = help->next;
        }
        help->next = tmp;
    }
    else
    {
        list = (FrameNode*)malloc(sizeof(FrameNode));
        FrameNode* tmp = (FrameNode*)malloc(sizeof(FrameNode));
        tmp->frame = addFrame(fr);
        list = tmp;
    }
}

我真的需要幫助,我必須在周日之前提交。 如果您發現任何問題,請告訴我謝謝大家!!!!!!!

鏈表的單獨結構通常只會增加復雜性。 為什么不直接使用:

struct my_frame {
    struct my_frame *next;
    char *name;
    int duration;
    char *path;
}

它降低了復雜性並簡化了 memory 分配。

一些個人喜好:我建議使用前綴來防止像“框架”這樣的通用名稱。 我還建議刪除 typedef。 它對你沒有任何作用。 它只會增加模糊性。 去掉類型名稱中的大寫字母。 If you want to program in C, learn C don't try to make it look like C++, C# or Java.

addFrame function 結束時,您釋放p ,但隨后您將其返回。

所以在tmp->frame = addFrame(fr); 在 function insertAtEnd中,您分配了一個已被釋放的指針,其內容未知。

解決方案是簡單地刪除addFrame中的free(p)行,但請確保稍后在程序中為該列表提供釋放機制。

編輯:另外,我現在在list = tmp;行中看到了 ,你實際上是在給局部變量list賦值,你應該做的是*list = tmp

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM