C 泛型链表:错误的输出



我设法为整数创建了一个单向链表。现在我想通过使用 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 *,然后取消引用它。

另外,请注意,在堆栈上存储指向对象的指针通常是一个坏主意,因为一旦对象超出范围,指针仍然存在,但指向堆栈上的随机垃圾。 以后不会造成无尽的痛苦。

相关内容

  • 没有找到相关文章

最新更新