【发布时间】: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->Heads[pos]) check=H->Heads[pos]; -
您混淆了数组和列表。
H->Heads[i].number不是访问列表的正确方法。对于列表,您需要H->Heads->number和H->Heads->next。next指针将指向列表的下一个元素 -
您使用
for (int i = 0; i < H->size; ++i)遍历列表,这是完全错误的。 -
一个列表通常有一个指向第一个节点的指针 (
head) 和一个指向最后一个节点的指针 (tail)。但是您正在使用一个节点来表示显然缺少tail的整个列表。如果没有tail将节点附加到列表,效率将非常低。带尾:tail->next = new_node; tail = new_node;查找here 以获取可能的实现。
标签: c linked-list