c - c链表追加插入
问题描述
我想在链表的末尾插入一个节点,但我不知道如何实现。
#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],节点总是在头部。
解决方案
您混淆了数组和列表。H->Heads[i].number
不是访问列表的正确方法。对于您需要的列表H->Heads->number
和H->Heads->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)++;
}
推荐阅读
- javascript - 返回视图 MVC/Javascript/.NET Core 时出现问题
- sql - 如何为每个工作编号创建具有最新日期的表格?SQL
- typescript - 如何使用 typescript 接口键入提示 Vue 道具?
- shell - 是否可以从 ansible 角色/文件目录运行 shell 脚本?
- python - 无法从“sklearn.metrics.pairwise”导入名称“haversine_distances”
- typescript - 控制台输出出现在 TypeScriptLang.org 的教程中的什么位置?
- python - 有趣的代码。它是如何工作的?
- ios - iOS:URLRequest Error Domain=NSURLErrorDomain Code=-1202 "此服务器的证书无效
- amazon-web-services - 如何使用 ENV 变量设置 default.region 和 default.output
- python - 没有 Spark 库的`spark-submit` vanilla Python 脚本