显示单个链表的内容,代码在退出

时间:2017-04-27 21:05:20

标签: c data-structures linked-list

这是我的问题代码

#include <stdio.h>
#include <stdlib.h>

typedef struct _node Node;
typedef void* Data;


struct _node
{
    Data* data;
    Node *next;
};


typedef struct _singleLinkedList SingleLL;

struct _singleLinkedList
{
    Node *head;
    Node *tail;    
    Node *current; //not used in this example
};


typedef struct _partls
{
    int x;
    int y;

}Parts;


Node *addhead(SingleLL *list, Data* data)
{
    Node *newnode = (Node*)malloc(sizeof(Node));
    if(newnode == NULL)
        return NULL;

    newnode->data = data;

    if(list->head == NULL)
    {
        newnode->next = NULL;
        list->tail = newnode;
    }
    else
    {
        newnode->next = list->head;
    }
    list->head = newnode;

    return newnode;
}


typedef void(*DISPLAY)(void*);

void displayparts(Parts* part)
{
    puts("part_x\t\tpart_y");
    printf("%d\t\t%d\n",part->x, part->y);
    putchar('\n');

}


void displaySingleLinkedList(SingleLL *list, DISPLAY display)
{
    Node *current;

    for(current = list->head; current != NULL; current = current->next)
        display(current->data);
}


void initSLList(SingleLL *list)
{
    list->head    = NULL;
    list->tail    = NULL; //not used in this example
}


int main(void)
{
    puts("\nlinked list test code");
    SingleLL *sLinkedList;

    //create an object
    Parts *part1 = (Parts*) malloc(sizeof(Parts));
    if(part1 == NULL)
    {
        puts("NULL");
        exit(1);
    }
    part1->x = 32;
    part1->y = 98;

    //create one more object
    Parts *part2 = (Parts*) malloc(sizeof(Parts));
    if(part2 == NULL)
    {
        puts("NULL");
        exit(1);
    }
    part2->x = 42;
    part2->y = 18;

    initSLList(&sLinkedList);
    addhead(&sLinkedList, part2);
    addhead(&sLinkedList, part1);
    displaySingleLinkedList(&sLinkedList, (DISPLAY) displayparts);
    return 0;

}

问题: 这是一个测试代码,而不是一个完整的完美外观片段。它有缺陷。我确实尝试了调试器逐行调整...当执行displayparts函数时它会中断,调试器说:无法访问地址0x0的内存。虽然它应该是足够的信息,但我认为我的思绪已经停滞不前,我无法弄明白。

您能帮助发现导致代码崩溃的问题/问题的根源吗?我应该修改什么才能让它无误地工作?

2 个答案:

答案 0 :(得分:4)

您的指针处理似乎已关闭,在多个位置。这里,

void initSLList(SingleLL *list)

main():
SingleLL *sLinkedList;
initSLList(&sLinkedList);

initSLList被赋予指针sLinkedList的地址,即指向指针的指针。

另外,你有

typedef void* Data;
Node *addhead(SingleLL *list, Data* data)

因为Data是一个指针,addhead需要一个指向指针的指针。 但是你给它一个指向零件结构的指针。

Gcc警告说要在六个不同的地方给出指向不兼容类型的指针。查看编译器具有的警告选项,并启用它们。

我建议非常谨慎地将指针指向不像指针的东西,只是为了避免像这样的混淆。但是在某些库接口中可能没问题。

答案 1 :(得分:1)

SingleLL *sLinkedList;
// ...
initSLList(&sLinkedList);

但是initSLList()SingleLL*传递SingleLL**时需要sLinkedList。我认为你的意思是将SingleLL声明为具体的-Wall,而不是指向一个gcc

您应该使用设置为最详细级别的警告进行编译(Message Name: Ball Field #1: Name: Color Type: unsigned int Start Bit: 0 Bit Length: 4 Field #2: Name: Radius Type: single Start Bit: 4 Bit Length: 32 Field #3: Name: New Type: bool Start Bit: 36 Bit Length: 1 中的yum search python | grep devel 将执行此操作)。这可能会对此以及程序中的其他问题产生警告。这是一个伟大的,虽然可悲的不是万无一失的方式来保护自己免受C脚射击自己的极度轻松。