无法将项目添加到链接列表的末尾

时间:2013-08-03 00:29:22

标签: c

此代码只在列表末尾添加一个元素(只创建头元素,之后没有任何内容)。我的程序出了什么问题?我应该在函数,头部和项目中传递两个项目还是只传递一个?

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

typedef struct MyList
{
    int x;
    int y;
    struct MyList * next;
}List;

typedef List * Item;

void AddEnd(Item * head);
void PrintList(Item * head);

int main(void)
{
    int response;
    Item head;
    head = NULL;
    while(1)
    {
        printf("1- Print, 2 - Add to End, 3 - exit\n");
        scanf("%d", &response);
        switch(response)
        {
            case 1: PrintList(&head); break;
            case 2: AddEnd(&head); break;
            case 3: return 0;
        }       
    }    
    return 0;
}

void PrintList(Item * head)
{
    Item temp;
    temp = *head;
    while(temp != NULL)
    {
        printf("%d %d\n", temp->x, temp->y);
        temp = temp->next;
    }
}

void AddEnd(Item * head)
{
    Item new, temp;
    new = (Item)malloc(sizeof(new));
    printf("Enter x and y: ");
    scanf("%d %d", &new->x, &new->y);
    new->next = NULL;
    if(*head == NULL)
    {
        *head = new;
    }
    else
    {
        temp = *head;
        while(temp != NULL)
        {
            temp = temp->next;
        }

        temp = new;
    }

}

我刚试过的这段代码也不起作用:

void AddEnd(Item * head, Item * item)
{
    Item new, temp;
    new = (Item)malloc(sizeof(new));
    printf("Enter x and y: ");
    scanf("%d %d", &new->x, &new->y);
    new->next = NULL;
    if(*head == NULL)
    {
        *head = new;
    }
    else
    {
        temp = *head;
        while(temp != NULL)
        {
            temp = temp->next;
        }

        temp = new;
        *item = temp;
    }
}

2 个答案:

答案 0 :(得分:2)

AddEnd子句中的else函数中,当您退出while循环时,temp现在是NULL。但是,它之前的元素仍然指向NULL

尝试类似

的内容
temp = *head;
if (temp->next == NULL) {
    temp->next = new;
} else {
    while((temp->next) != null) {
        temp = temp->next;
    }
    temp->next = new;
}

else条款中。

(这个,以及您对其他人引用的malloc的理解的明显问题,new应该是Item *,malloc调用应该是malloc(sizeof(Item))。你也是不需要转换malloc的返回值(事实上,如果你这样做会发生一些陷阱)。)更密切地阅读你的typedef,new 应该实际上是Item(因为它是指向List结构的指针,你有typedef List* Item)。试试new = malloc(sizeof(List));,然后将new声明为List *类型。 (typedef List * Item使您的代码难以阅读;它变得不那么明确指针是什么,什么不是。)

答案 1 :(得分:0)

你需要改变这个:

new = (Item)malloc(sizeof(new));

对此:

new = (Item *)malloc(sizeof(List));

希望这有帮助