使用指针C实现双链表实现
作者:互联网
我目前正在教自己C并且正在尝试使用部分完成的指针在C中实现双向链表.我知道代码当前无法处理悬空节点或输出错误,我将在下面实现这两个.但是,代码应该至少能够构造一个列表对象并向其添加元素.目前,当我尝试调用列表的构造函数时,我收到一个错误,表示我正在请求从LinkedList *到非标量类型LinkedList的转换.为什么我的列表被声明为指针?非常感谢任何帮助,谢谢!
LinkedList.h
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
struct dataElement {
int key;
int id;
};
struct Node
{
dataElement data;
Node* next;
Node* prev;
};
class LinkedList
{
public:
/** Default constructor */
LinkedList();
/** Default destructor */
virtual ~LinkedList();
void addAtFront(int newElement);
void addAtBack(int newElement);
int removeTop();
int removeBottom();
int getTop();
int getBottom();
int findKey(int keyToFind);
protected:
private:
Node* head;
Node* tail;
int size;
};
#endif // LINKEDLIST_H
LinkedList.cpp
#include "LinkedList.h"
#include <iostream>
#include <stdlib.h>
LinkedList::LinkedList()
{
size = 0;
}
LinkedList::~LinkedList()
{
//dtor
}
void LinkedList::addAtFront(int newElement)
{
if (size == 0)
{
Node temp;
temp.data.id = newElement;
temp.data.key = 0;
head = &temp;
tail = &temp;
++size;
}
else
{
Node temp;
temp.data.id = newElement;
temp.data.key = size;
temp.next = head;
head->prev = &temp;
head = &temp;
++size;
}
}
void LinkedList::addAtBack(int newElement)
{
if (size == 0)
{
Node temp;
temp.data.id = newElement;
temp.data.key = 0;
head = &temp;
tail = &temp;
++size;
}
else
{
Node temp;
temp.data.id = newElement;
temp.data.key = 0;
tail->next = &temp;
temp.prev = tail;
tail = &temp;
++size;
}
}
LinkedListTest.cpp
#include "LinkedListTest.h"
#include "LinkedList.h"
int main()
{
LinkedList list = new LinkedList();
list.addAtFront(0);
}
解决方法:
该错误意味着您将某个LinkedList列表声明为不是指针,您可以为其指定一个新的LinkedList(),其类型为LinkedList *(而不是LinkedList).它应该是:
LinkedList* list = new LinkedList(); // I declare a pointer to a list
list->addAtFront(0); // I call a method on a pointer to an object
要么
LinkedList list;
list.addAtFront(0);
它们是两种不同的类型,分配在两个不同的存储器中,这很重要,请继续阅读.
我更重要的是,当你使用动态分配的内存时,应该考虑实际分配堆对象,这些对象应该保持声明它们的作用域.
更具体地说,这个:
{
Node temp;
..
head = &temp;
..
}
这会导致问题,因为temp被声明为堆栈上的自动存储,这意味着一旦你获得了它的地址并将其分配给head或tail或者其他什么,一旦范围退出,该地址将不再有效.你应该在堆上分配它:
Node temp = new Node(value, id);
head = temp;
tail = temp;
++size;
请注意,这需要您在不再需要Node时自己从堆中清理内存.
标签:doubly-linked-list,c,list,pointers,linked-list 来源: https://codeday.me/bug/20191009/1875462.html