【问题标题】:c linked list append insertc链表追加插入
【发布时间】:2018-11-21 06:41:48
【问题描述】:

我想在链表的末尾插入一个节点,但是不知道怎么实现。

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

typedef struct Info* PtrToNode;
struct Info {
    int number;
    PtrToNode next;
};
typedef struct Info* list;

typedef struct HashNode* HashTable;
struct HashNode {
    list Heads;
    int size;
};

HashTable createTable(int size) {
    HashTable H = (HashTable)malloc(sizeof(struct HashNode));
    H->size = size;
    H->Heads = (PtrToNode)malloc(H->size * sizeof(struct Info));
    for (int i = 0; i < H->size; ++i)
    {
        H->Heads[i].number = 0;
        H->Heads[i].next = NULL;
    }
    return H;
}

int Hash(int n, int size) {
    return n % size;
}

void insert(HashTable H, int index, int number) {
    int pos = Hash(number, H->size);

    list check = H->Heads[pos].next;
    while (check) {
        check = check->next;
    }
    PtrToNode newNode = (PtrToNode)malloc(sizeof(struct Info));
    newNode->number = number;
    newNode->next = NULL;
    check = newNode;
}

我想在插入函数中追加,但参数“检查”像临时的,如果我“同时”H->heads[pos],节点总是在头中。

【问题讨论】:

  • 您的实际代码有什么问题?另外,您应该首先确保列表不为空,而不是list check = H-Heads[pos].next;,然后指向列表的头部;即:if(H-&gt;Heads[pos]) check=H-&gt;Heads[pos];
  • 您混淆了数组和列表。 H-&gt;Heads[i].number 不是访问列表的正确方法。对于列表,您需要 H-&gt;Heads-&gt;number 和 H-&gt;Heads-&gt;next。 next 指针将指向列表的下一个元素
  • 您使用for (int i = 0; i &lt; H-&gt;size; ++i) 遍历列表,这是完全错误的。
  • 一个列表通常有一个指向第一个节点的指针 (head) 和一个指向最后一个节点的指针 (tail)。但是您正在使用一个节点来表示显然缺少tail 的整个列表。如果没有tail 将节点附加到列表,效率将非常低。带尾:tail-&gt;next = new_node; tail = new_node; 查找here 以获取可能的实现。

标签: c linked-list


【解决方案1】:

您混淆了数组和列表。 H-&gt;Heads[i].number 不是访问列表的正确方法。对于列表,您需要 H-&gt;Heads-&gt;number 和 H-&gt;Heads-&gt;next。 next 指针将指向列表的下一个元素

基本上你有一个带有额外未使用指针的数字数组。

对于给定的create函数在末尾添加一个元素,您需要realloc整个数组具有新的大小。但是,这可能不是您想要的。

你需要修改create函数来制作一个真实的列表,然后你可以追加。

下面的代码,在末尾插入,可以修改为在特定索引处插入。

typedef struct Info* PtrToNode;
struct Info {
    int number;
    PtrToNode next;
};
typedef struct Info* list;

typedef struct HashNode* HashTable;
struct HashNode {
    list Heads;
    int size;
};

HashTable createTable(int size) {
    HashTable H = (HashTable)malloc(sizeof(struct HashNode));
    H->size = size;
    H->Heads = malloc(sizeof(struct Info));
    H->Heads->number = 0;
    H->Heads->next = NULL;

    list curr = H->Heads;
    list nextval;

    for (int i = 1; i < H->size; ++i)
    {
        nextval = malloc(sizeof(struct Info));
        nextval->number = 0;
        nextval->next = NULL;
        curr->next = nextval;
        curr = curr->next;
    }
    return H;
}

int Hash(int n, int size) {
    return n % size;
}


void insert(HashTable H, int index, int number) {
    int pos = Hash(number, H->size);

    list check = H->Heads;
    while (check->next)  {
        check = check->next;
    }
    PtrToNode newNode = (PtrToNode)malloc(sizeof(struct Info));
    newNode->number = number;
    newNode->next = NULL;
    check->next = newNode;

    (H->size)++;
}

【讨论】:

  • 谢谢。把“check”改成“list check = &H->Heads[pos];”,就ok了,
猜你喜欢
  • 1970-01-01
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
  • 2019-09-15
  • 1970-01-01
  • 2020-11-25
相关资源
最近更新 更多