C通用链表:输出错误

时间:2014-11-26 17:10:55

标签: c linked-list abstract-data-type

我设法为整数创建了一个单链表。 现在我想通过使用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:奇数正方形,带数字

1 个答案:

答案 0 :(得分:0)

您需要将输出行从%d更改为%p以显示指针本身,或将void *转换为int *然后取消引用它。

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