#include <iostream>
using namespace std;
struct Node
{
int item; // storage for the node's item
Node* next; // pointer to the next node
};
Node* addNode(Node*& head, int data , int& count)
{
Node * q; // new node
q = new Node; // allocate memory for the new mode
q->item = data; // inserting data for the new node
q->next = head; // point to previous node ?? how would i do that? ( am i doing it correctly?)
count++; // keep track of number of node
head = q;
return q;
}
int main()
{
int a, count=0;
int data;
bool repeat;
Node *head= NULL;
//^^ assuming thats creating the first node ^^
do
{
cout << "please enter the data for the next node" <<endl;
cin >> data;
addNode(head, data, count);
cout << "do you wish to enter another node? (enter true or false)" << endl;
cin >>repeat;
}
while (repeat == true);
// assuming this is the print function
while(head != NULL)
{
cout << "output" << temp->item << endl;
cout << temp->next << endl;
}
system("pause");
return 0;
}
okey我尝试在列表中添加一个新元素,我将如何像LIFO内存(堆栈)那样移动磁头,所以最后一个元素在最上面。
任何帮助,将不胜感激 !指针和节点最近使我的大脑困惑。
最佳答案
由于我不确定每个答案都能完全回答问题,因此这是一个链表实现(编写时没有testig:
// your (correct) structure
struct Node
{
float item; // storage for the node's item
Node* next; // pointer to the next node
};
现在我们需要在某处有两个指针来照看列表:
/* some pointers */
struct List
{
Node* head;
Node* tail;
};
现在我们需要创建一些元素。正如其他人所说,您可以使用new来做到这一点:
/* create some elements we want to link in */
Node* elem1 = new Node();
Node* elem2 = new Node();
Node* elem3 = new Node();
/* maybe even set their properties! */
elem1->item = 3.14;
elem2->item = 3.14;
elem3->item = 3.14;
注意我还没有尝试将这些元素添加到列表中吗?那是因为我脑子里有个看起来像这样的函数:
void addtolist(List &list, Node* node)
{
/* if no head, initialise the list */
if ( list->head == NULL )
{
list->head = node;
list->tail = node;
}
else if ( list->head != NULL && list->tail != NULL )
{
/* access the tail element and set its
next to this ptr.
Move tail to this node */
list->tail->next = node;
list->tail = node;
}
else
{
/* probably raise an exception! */
}
}
您可以通过执行以下操作来调用它:
List l;
addtolist(l, elem1); /* etc */
删除元素有些棘手,因为您必须转到该元素,记住它的前一个元素,捕获它的下一个元素,将它们加入并删除您所在的Node *。
现在遍历列表...您的术语
HEAD|TAIL
让我想起了Erlang和tail递归,其中当前元素称为head,其余元素称为tail。如果我写:Node* cur = l.head;
while ( cur != NULL )
{
// do something with cur.item ?
cur = cur->next;
}
您可以看到这种情况。多亏了
cur
结构,将head
替换为List
不会造成任何危害。最后,我在这里使用了一种非常类似于C的方法,但是模板的范围很广:
template<typename T>
struct node
{
T item; // storage for the node's item
Node<T>* next; // pointer to the next node
};
并将
List
结构封装为一个类:template<typename T>
class List
{
protected:
Node<T>* head;
Node<T>* tail;
public:
void addtolist(Node<T>* node);
Node<T>* gethead();
Node<T>* gettail();
}
这使您更接近
std::list
。关于c++ - 链表C++,问题自学习,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5689432/