c中单链表中的输出错误

时间:2016-05-12 05:48:02

标签: c struct

我需要帮助。我试图创建一个单链表。到目前为止一切都很好,但我输错了。我不知道我的错误。谢谢!

我的输出是:

 create a single linked list
 list:
 aaaaa
 -1342177280 

我的代码是:

struct node{

    int key;
    int val; 
    struct node *next;  

};

struct node *create_single_link(){

    struct node *head = malloc(sizeof(struct node));

    head->next = NULL;

    return(head);

}


void insertVal( struct node *lst, int v){

    struct node *current = malloc(sizeof(struct node));
    current -> val = v;

    current->next = lst;
    lst = current;

}

void print_list(struct node * head){


    struct node *ptr = head;

    printf("list:\n");

    while(ptr != NULL ){
        printf("aaaaa\n");
        printf("%d \n ",ptr ->val );
        ptr = ptr->next;
    }


}

int  main(int argc, char const *argv[])
{

    struct node *list;
    list = create_single_link();
    if(list != NULL){
        printf("create a single linked list\n");
    }
    else
        printf("failed to create a single linked list\n");

    insertVal(list,2222);
    //insertVal(list,2);
    print_list(list);


    return 0;
}

4 个答案:

答案 0 :(得分:3)

问题1

你有:

void insertVal( struct node *lst, int v){

    struct node *current = malloc(sizeof(struct node));
    current -> val = v;

    current->next = lst;
    lst = current;
}

这不会改变listmain的值。它仅在函数中lst指向本地的位置。

我建议将功能更改为:

struct node* insertVal( struct node *lst, int v){

    struct node *current = malloc(sizeof(struct node));
    current -> val = v;

    current->next = lst;
    return current;
}

并将其用作:

list = insertVal(list, 2222);

问题2

create_single_link中创建的节点的值未初始化。最好不要使用它。您可以将main更改为:

int  main(int argc, char const *argv[])
{
   struct node *list = NULL;
   list = insertVal(list,2222);
   list = insertVal(list,2);
   print_list(list);

   return 0;
}

答案 1 :(得分:0)

insertVal修改lst但不返回。

这意味着只能添加一个项目。

您正在使用初始化v

打印出头部

答案 2 :(得分:0)

  1. 列表应该有它的头部,它指向列表的下一个元素。你做了相反的事情:列表的其余部分(第一个数据部分)指向头部(insertVal()
  2. 头部通常已经存储了第一条数据;你只使用head作为指向列表其余部分的指针,而不是用于存储数据。
  3. 您观察到的错误行为的原因是,在print_list()中,您假设与我的项目1.和2.上面相反:您尝试打印出与头部相关联的val(这是针对上面的第2项),并假设其余的列表元素跟随头部(这与上面的第1项相对)。 我建议原样离开print_list(),但要更正前两项。
  4. 顺便说一下,您可以考虑更改问题的措辞,因为您的问题不在于“输出错误”,而是在C中使用列表实现。有关示例实现,请参阅http://www.cprogramming.com/tutorial/c/lesson15.html
  5. 我现在正在跳过您的struct node有两个字段(keyval)但您的insertVal()仅填充vall。虽然本身不​​是错误,但是很快就会忘记为key分配有意义的值。 快乐的编码: - )

答案 3 :(得分:0)

事实上,你的fucntion插入值没有任何意义,如果你想在链表的末尾插入一个值,我希望下面的代码可以帮助你。

#include <stdio.h>
#include <stdlib.h>
struct node{
    int key;
    int val;
struct node *next;
};

struct node *create_single_link() {
struct node *head = (struct node*)malloc(sizeof(struct node));
head->next = NULL;
return (head);
}

void insertVal (struct node *lst, int v) {
while(lst->next != NULL) {
    lst = lst->next;
}
lst->next = (struct node*)malloc(sizeof(struct node));
lst->next->val = v;
lst->next->next = NULL;
}

void print_list(struct node *ptr) {
while(ptr != NULL) {
    printf("the key is %d and the value is %d\n", ptr->key, ptr->val);
    ptr = ptr->next;
}
}


void main(void) {

struct node *list;
list = create_single_link();
if(list != NULL) 
    printf("a single list has been created\n");
else
    printf("faied to create a single list\n");
list->val = 1111;
insertVal(list, 2222);
insertVal(list, 3333);
print_list(list);
}