我设法为整数创建了一个单链表。 现在我想通过使用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:奇数正方形,带数字
答案 0 :(得分:0)
您需要将输出行从%d更改为%p以显示指针本身,或将void *转换为int *然后取消引用它。
另外,请注意,存储指向堆栈上对象的指针通常是一个坏主意,因为一旦对象超出范围,指针仍然存在,但指向堆栈上的随机垃圾。它会在以后引起痛苦。