我设法为整数创建了一个单向链表。现在我想通过使用 void 指针将其扩展到所有类型的数据。不知何故,这不起作用。你能看看吗?谢谢!
非通用:linkedlist.h
// Singly Linked List
#ifndef linked_list
#define linked_list
#include <stdlib.h>
typedef struct link_list_node {
struct link_list_node *next;
int data;
} ll_node;
typedef struct link_list {
struct link_list_node *head;
} ll;
ll *ll_create(ll_node *head);
ll_node *ll_node_create(int data);
ll *ll_insert_end(ll *list, ll_node *node);
#endif
linkedlist.h
#include "linkedlist.h"
ll *ll_create(ll_node *head){
ll *list = malloc(sizeof(ll));
list->head = head;
return list;
}
ll_node *ll_node_create(int data){
ll_node *node = malloc(sizeof(ll_node));
node->next = NULL;
node->data = data;
return node;
}
ll *ll_insert_end(ll *list, ll_node *node){
ll_node *next;
if (list->head->next == NULL){
list->head->next = node;
}
else{
for (next = list->head->next; next != NULL; next = next->next){
if (next->next == NULL){
next->next = node;
break;
}
}
}
return list;
}
linkedlist_main.c:
// gcc -std=c99 -o list linkedlist_main.c linkedlist.c
// Singly Linked List Test
#include "linkedlist.h"
#include <stdio.h>
int main(){
ll *list = ll_create(ll_node_create(1));
list = ll_insert_end(list, ll_node_create(2));
printf("Node 1: %d n", list->head->data);
printf("Node 2: %d n", list->head->next->data);
}
修改为:.h
typedef struct link_list_node {
struct link_list_node *next;
void *data;
} ll_node;
.c
ll_node *ll_node_create(void *new_data){
ll_node *node = (ll_node*)malloc(sizeof(ll_node));
node->next = NULL;
node->data = new_data;
return node;
}
主要
int dat1 = 1;
int dat2 = 2;
ll *list = ll_create(ll_node_create(&dat1));
list = ll_insert_end(list, ll_node_create(&dat2));
printf("Node 1: %d n", list->head->data);
printf("Node 2: %d n", list->head->next->data);
没有编译器错误或警告:输出是节点 1:带有数字的奇怪方块
您需要
将输出行从 %d 更改为 %p 以显示指针本身,或者将 void * 转换为 int *,然后取消引用它。
另外,请注意,在堆栈上存储指向对象的指针通常是一个坏主意,因为一旦对象超出范围,指针仍然存在,但指向堆栈上的随机垃圾。 以后不会造成无尽的痛苦。