我在尝试为链接列表中的所有功能创建单元测试时遇到了麻烦。主要是我在构建但不插入的插入函数方面遇到问题,而我的第一个函数只返回链接列表第一个插槽中的数据。
我的代码出现以下错误:#include <stdio.h>
#include <malloc.h>
typedef struct _key{
int k; // can be anything
} key;
typedef struct _value{
int v; // can be anything
} value;
int count = 0;
key keys[1000];
value map[1000];
int getIndex(key k){
for(int i = 0; i < count; i++){
if(keys[i].k == k)
return i;
}
return -1;
}
void put(key k, value v){
int p = getIndex(k);
if(p >= 0){
map[p] = v;
}
else{
keys[count] = k;
map[count] = v;
count++;
}
}
value get(key k){
value empty;
empty.v = -1;
int p = getIndex(k);
if(p >= 0){
return map[p];
}
else{
return empty;
}
}
int main(){
key k;
value v;
k.k = 2;
v.v = 5;
put(k, v);
v = get(k);
printf("key: %d value: %d\n", k.k, v.v);
return 0;
}
错误C2440&#39;返回&#39;:无法转换为&#39; int&#39;到&#39; ListNode *&#39;单元测试
PS。我的老师帮我创建了链接列表,所以我假设它是正确的代码,但我觉得很难遵循。
source.cpp
newNodeCatch = myList.First();
LinkedList.h
void TestLinkedList()
{
printf("\n====================================================\n");
printf(" LINKED LIST FUNCTIONS TEST");
printf("\n====================================================\n\n");
LinkedList<int> myList;
Iter<int> iter;
printf("\nCreating and populating a new LinkedList . . .\n");
myList.PushFront(6);
myList.PushFront(3);
myList.PushFront(1);
myList.PushBack(78);
myList.PushBack(12);
myList.PushBack(34);
printf("Testing operator overloads, peek at the code to see!\n");
cout << endl << "Current values are" << endl;
iter = myList.Begin(); //=
while (iter != myList.End()) // != ==
{
std::cout << iter.value() << std::endl; //value()
++iter; // --
}
ListNode<int>* newNode = new ListNode<int>;
newNode->data = 5;
myList.Insert(newNode);
//moving the iter back to the start
while (iter != myList.Begin()) // != ==
{
--iter; // --
}
cout << endl << "Current values are" << endl;
while (iter != myList.End()) // != ==
{
std::cout << iter.value() << std::endl; //value()
++iter; //++ --
}
ListNode<int>* newNodeCatch = new ListNode<int>;
newNodeCatch = myList.First();
}
int main()
{
TestLinkedList();
system("pause");
return 0;
}
ListNode.h
#pragma once
#include "ListNode.h"
#include <crtdbg.h>
template <typename T>
class Iter
{
ListNode<T>* current;
public:
//=
Iter& operator=(ListNode<T>* other)
{
//LinkedList<int> other1;
current = other;
return *this;
}
//!=
bool operator!=(ListNode<T>* other)
{
if (current != other)
return true;
else
return false;
}
//==
bool operator==(ListNode<T>* other)
{
if (current == other)
return true;
else
return false;
}
//->
T value()
{
return current->data;
}
//++
void operator++()
{
current = current->next;
}
//--
void operator--()
{
current = current->prev;
}
};
template <typename T>
class LinkedList
{
public:
LinkedList()
{
start = new ListNode<T>();
_ASSERT(start);
end = new ListNode<T>();
_ASSERT(end);
start->next = end;
end->prev = start;
start->prev = nullptr;
end->next = nullptr;
}
~LinkedList()
{
delete end;
delete start;
}
void PushFront(T data)
{
ListNode<T>* node = new ListNode<T>();
_ASSERT(node);
node->data = data;
node->next = start->next;
start->next->prev = node;
start->next = node;
node->prev = start;
}
void PushBack(T data)
{
ListNode<T>* node = new ListNode<T>();
_ASSERT(node);
node->data = data;
node->prev = end->prev;
end->prev->next = node;
end->prev = node;
node->next = end;
}
void Insert(ListNode<T>* node)
{
ListNode<T>* firstNode = node;
ListNode<T>* lastNode = node->next;
ListNode<T>* newNode = new ListNode<T>*;
//ListNode<T>* newNode = new ListNode<T>;
_ASSERT(newNode);
firstNode = newNode->prev;
lastNode = newNode->next;
//delete node;
}
ListNode<T>* Begin()
{
return start->next;
}
ListNode<T>* End()
{
return end;
}
ListNode<T>* First()
{
_ASSERT(start->next != end);
return start->next->data;
}
ListNode<T>* Last()
{
_ASSERT(end->prev != start);
return end->prev->data;
}
int Count()
{
int m_count = 0;
ListNode<T>* current = start->next;
while (current != end)
{
++current;
++m_count;
}
return m_count;
}
ListNode<T>* Delete(ListNode<T>* node)
{
ListNode<T>* prevNode = node->prev;
ListNode<T>* nextNode = node->next;
prevNode->next = nextNode;
nextNode->prev = prevNode;
delete node;
return nextNode;
}
void Erase(Iter<T> & target)
{
target.current = Delete(target.current);
}
void Remove(T value)
{
ListNode<T>* current = start->next;
while (current != end)
{
if (current.data == value)
{
current = Delete(current);
}
else
{
++current;
}
}
}
void PopBack()
{
_ASSERT(end->prev != start);
Delete(end->prev);
}
void PopFront()
{
_ASSERT(start->next != end);
Delete(start->next);
}
void Clear()
{
ListNode<T>* current = start->next;
while (current != end)
{
current = Delete(current);
++current;
}
}
private:
ListNode<T>* start;
ListNode<T>* end;
int m_Iterator;
};
答案 0 :(得分:1)
问题看起来就像在这里(报告错误的行号会很有帮助)
ListNode<T>* First()
{
_ASSERT(start->next != end);
return start->next->data;
}
该函数定义为返回指向列表节点的指针,但是您返回的数据(在本例中是一个int),因此编译器正在报告:错误C2440'返回':不能从'int'转换为'ListNode *'
该函数应返回第一个节点,因此应该是:start-&gt; next