【问题标题】:Singly Linked List head of 0单链表头部为 0
【发布时间】:2021-11-30 05:51:15
【问题描述】:

我遇到了单链表问题。

当我在头前插入一些东西时。 head 总是有 0 个数据。 我认为init_list() 函数有问题。我认为 0 的头部来自随机初始化的数据。

如果没有 head 0 问题,一切都很好。

我确定初始化方法是错误的。但是不知道怎么解决..

这是我的 I/0 和所需的输出

Input

2
insert 0 1
size

Output I got

1->0->NULL
2
1->0->NULL

Desired Output

1->NULL
1
1->NULL

这是我的代码

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

typedef int Element;
typedef struct LinkedNode {
    Element data;
    struct LinkedNode* link;
} Node;
Node* head;
void init_list() { 
    head = (Node*)malloc(sizeof(Node));
    head->link = NULL;
}
int is_empty() { 
    if (head == NULL) return 1;
    else return 0;
}

Node* get_entry(int pos)
{
    Node* p = head; 
    int i;
    for (i = 0; i < pos; i++, p=p->link){
        if (p == NULL) return NULL; 
    }
    return p;
}

int size() 
{
    Node* p;
    int count = 0;
    for (p = head; p != NULL; p = p->link)
        count++; 
    return count;
}

void replace(int pos, Element val) 
{
    Node* node = get_entry(pos); 
    if (node != NULL) 
        node->data = val; // replace
}

Node* search_list(Element val) 
{
    Node* p;
    for (p = head; p != NULL; p = p->link) 
        if (p->data == val) return p;
    return NULL; 
}

void insert_next(Node * before, Node * node) 
{
    if (node != NULL) {
        node->link = before->link; 
        before->link = node; 
    }
}

void insert(int pos, Element val) 
{
    Node* new_node, * prev;
    new_node = (Node*)malloc(sizeof(Node)); 
    new_node->data = val; 
    if (pos == 0) { 
        new_node->link = head; 
        
        head = new_node; 
    }
    else {
        prev = get_entry(pos-1); 
        if (prev != NULL)
            insert_next(prev, new_node); 
        else free(new_node);
    }
}

Node * remove_next(Node * prev) 
{
    Node* removed = prev->link; 
    if (removed != NULL) {
        prev->link = removed->link;
    }
    return removed; 
}

void delete(int pos) 
{
    Node* prev, * removed;

    if (pos == 0 && is_empty() == 0) { 
        removed = get_entry(pos); 
        head = head->link;
        free(removed); 
    }
    else {
        prev = get_entry(pos-1); 
        if (prev != NULL) {
            remove_next(prev); 
            free(removed); 
        }
    }
}

void clear_list()
{
    while (is_empty() == 0) 
        delete(0);
}

void print_list()
{
    Node* p;
    for (p = head; p != NULL; p = p->link)
        printf("%d->", p->data);
    printf("NULL\n");
}

Node * concat_list(Node * new_node)
{
    if(is_empty()) return new_node; 
    else if(new_node == NULL) return new_node; 
    else{
        Node* p; 
        p = head;
        while (p->link != NULL) {
            p = p->link;
        } 
        p->link = new_node; 
        return head;
    }
}
int main(void)
{
    Element num;
    int pos;
    int n, i, j, len;
    char c[15];
    Node* tmp_head= NULL;
    Node* new_head= NULL;
    init_list();
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        scanf("%s", c);

        if (strcmp(c, "insert") == 0) { scanf("%d %d\n",&pos, &num); insert(pos,num); print_list();}
        else if (strcmp(c, "delete") == 0) { scanf("%d\n", &pos); delete(pos); print_list();}
        else if (strcmp(c, "size") == 0) {printf("%d\n", size()); print_list();}
        else if (strcmp(c, "empty") == 0) {printf("%d\n", is_empty()); print_list();}
        else if (strcmp(c, "getEntry") == 0) { scanf("%d\n", &pos); printf("%d\n", get_entry(pos)->data); print_list();}
        else if (strcmp(c, "search_list") == 0) { scanf("%d\n", &num); printf("%d\n", search_list(num)->data); print_list();}
        else if (strcmp(c, "replace") == 0) { scanf("%d %d\n", &pos, &num); replace(pos,num); print_list();}
        else if (strcmp(c, "concat_list") == 0) { 
            tmp_head = head;
            init_list();
            scanf("%d", &len);
            for (j = 0; j < len; j++)
            {
                scanf("%d %d\n",&pos, &num); insert(pos,num);
            }
            printf("new_node: ");
            print_list();
            new_head = head;
            head = tmp_head;
            head = concat_list(new_head); 
            print_list();
        }
        else printf("error\n");
    }
    return 0;
}

【问题讨论】:

  • 为了创建一个配得上这个名字的MCVE,您可以轻松地剥离所有未使用的函数。您可以通过固定的步骤顺序替换整个菜单系统来重现。

标签: c algorithm data-structures linked-list


【解决方案1】:

基本问题是在init_list内部,代码只初始化link而不是data。我建议您将 head 初始化为 NULL 并简单地使用 insert 创建节点。

【讨论】:

  • 首先,当我编辑代码时 head->data = NULL;在 init_list 中,它会导致同样的问题。你的建议是我想做的,但是,由于教授的要求,它仅限于编辑代码插入功能,,
  • 你误会了。写入head = NULL;,不要在init_list内分配内存。
  • 啊哈哈我试试谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-09
  • 2019-10-30
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 2020-06-23
相关资源
最近更新 更多