在C+中以相反顺序打印我的链接列表+; 所以我对C++比较陌生,今天我决定坐下来,理解链接列表是如何工作的。到目前为止,我做这件事很有意思,但我在尝试以相反顺序打印链接列表时遇到了一个问题(而不是按链接列表的相反顺序!)
另外,我想在没有双链接列表的情况下做到这一点:在C+中以相反顺序打印我的链接列表+; 所以我对C++比较陌生,今天我决定坐下来,理解链接列表是如何工作的。到目前为止,我做这件事很有意思,但我在尝试以相反顺序打印链接列表时遇到了一个问题(而不是按链接列表的相反顺序!),c++,linked-list,C++,Linked List,另外,我想在没有双链接列表的情况下做到这一点: #include <iostream> #include <string> using namespace std; class LinkedList { public: LinkedList() { head = NULL; } void addItem(string x) { if
#include <iostream>
#include <string>
using namespace std;
class LinkedList
{
public:
LinkedList()
{
head = NULL;
}
void addItem(string x)
{
if(head == NULL)
{
head = new node();
head->next = NULL;
head->data = x;
} else {
node* temp = head;
while(temp->next != NULL)
temp = temp->next;
node* newNode = new node();
newNode->data = x;
newNode->next = NULL;
temp->next = newNode;
}
}
void printList()
{
node *temp = head;
while(temp->next != NULL)
{
cout << temp->data << endl;
temp = temp->next;
}
cout << temp->data << endl;
}
void addToHead(string x)
{
node *temp = head;
head = new node;
head->next = temp;
head->data = x;
}
int countItems()
{
int count = 1;
for(node* temp = head; temp->next != NULL; temp = temp->next)
++count;
return count;
}
void printReverse()
{
node* temp2;
node* temp = head;
while(temp->next != NULL)
temp = temp->next;
//Print last node before we enter loop
cout << temp->data << endl;
for(double count = countItems() / 2; count != 0; --count)
{
//Set temp2 before temp
temp2 = head;
while(temp2->next != temp)
temp2 = temp2->next;
cout << temp2->data << endl;
//Set temp before temp2
temp = head;
while(temp->next != temp2)
temp = temp->next;
cout << temp->data << endl;
}
cout << "EXIT LOOP" << endl;
}
private:
struct node
{
string data;
node *next;
}
*head;
};
int main()
{
LinkedList names;
names.addItem("This");
names.addItem("is");
names.addItem("a");
names.addItem("test");
names.addItem("sentence");
names.addItem("for");
names.addItem("the");
names.addItem("linked");
names.addItem("list");
names.printList();
cout << endl;
names.addToHead("insert");
names.printList();
cout << endl;
cout << names.countItems() << endl;
cout << "Print reverse: " << endl;
names.printReverse();
cout << endl;
return 0;
}
#包括
#包括
使用名称空间std;
类链接列表
{
公众:
LinkedList()
{
head=NULL;
}
无效附加项(字符串x)
{
if(head==NULL)
{
头=新节点();
head->next=NULL;
头部->数据=x;
}否则{
节点*温度=头部;
while(临时->下一步!=NULL)
温度=温度->下一步;
node*newNode=newNode();
newNode->data=x;
newNode->next=NULL;
temp->next=newNode;
}
}
作废打印列表()
{
节点*温度=头部;
while(临时->下一步!=NULL)
{
下一步是收集数据;
}
cout data next=温度;
头部->数据=x;
}
int countItems()
{
整数计数=1;
对于(节点*temp=head;temp->next!=NULL;temp=temp->next)
++计数;
返回计数;
}
void printReverse()
{
节点*temp2;
节点*温度=头部;
while(临时->下一步!=NULL)
温度=温度->下一步;
//在进入循环之前打印最后一个节点
cout data next!=temp)
temp2=temp2->next;
cout data next!=temp2)
温度=温度->下一步;
在printList
中,您还必须检查head==NULL
,否则您正在访问指向NULL
的指针的成员
void printList()
{
node *temp = head;
while(temp != NULL) // don't access ->next
{
cout << temp->data << endl;
temp = temp->next;
}
}
您应该考虑重新编写循环以在最后一个元素(如您所做的那样)开始,并且在到达<代码>标题>代码>时,循环条件停止。在<<代码> > <代码>循环中,伴随着奇数<代码>计数/ 2 逻辑肯定迷惑了您(和我们)。
请注意,您已经拥有
temp=previous元素的代码:
temp2 = head;
while(temp2->next != temp)
temp2 = temp2->next;
因为我假设这是一种类型的赋值,我故意不给你C++代码。即使不是赋值,记住它的过程应该是你正在经历的学习体验。但是,如果你给它一个机会,仍然有问题,随时更新你的问题(或者发布一个新的问题)。.
void printReverse()
{
printReverse(head)//启动下面的重载功能
}
void printReverse(节点*n)
{
如果(n==0)返回;
printReverse(n->next);//打印下一个
cout datafor(双重计数=countItems()/2;计数!=0;--count)
{
//将temp2设置在temp之前
temp2=头部;
while(temp2->next!=temp)
temp2=temp2->next;
cout-datanext;
cout data打印语句应采用以下方式:
void print() {
node *temp;
temp= head;
while (temp != NULL) {
cout << temp->data << " ";
temp = temp->next;
}
}
void print(){
节点*温度;
温度=水头;
while(temp!=NULL){
下一步是收集数据;
}
}
无效反向打印(节点*头)
{
节点*curNode=头部;
if(curNode!=NULL){
如果(curNode->next!=NULL){
反向打印(curNode->next);
}
cout data你的代码崩溃是什么意思?它是如何崩溃的?当你运行它时会发生什么?因为代码使用奇数个元素(没有“insert”元素),但使用偶数失败,这应该给你一个提示…@SethCarnegie:为什么这么说?+1只是因为你似乎愿意学习东西,这是(悲哀的)很少在关于堆栈溢出的初学者问题中看到。@DougRamsey很抱歉没有提供更多关于堆栈溢出的信息。这是我在这里的第一篇帖子,我下次会记住。这不是真正的问题。问题在于当countItems()
很奇怪时,countItems()永远不会达到零。@akappa不。countItems()/2
的计算结果为int(虽然使用双精度
作为计数器完全是WTF)@Andreitta:oops,是的。重点是。@akappa是的,你是对的,但是这是我看到的第一件事。更新了我的答案。+1,在写我的答案之前我应该先看看你的答案。但这非常简单(对我们来说)谢谢你的回答。这不是作业,但我还是不喜欢被填鸭式的回答。我会看看在你的提示后我是否能自己弄明白。@Marcan你的代码中已经有了所有的基本元素,你只需要删除一些代码并将你的循环修改为,而不是循环r
循环。这甚至不对,你不能向后循环……这是一个单循环link@acid这是他问题的一部分挑战。请注意,我并没有说我们的temp2=temp2->previous
,因为这显然需要一个双链接列表。但这并不意味着没有办法获得之前的元素t、 其他答案建议使用递归,这对小列表是可行的,但如果列表可能很大,并且您需要很少向后打印(希望如此),则有方法获取上一个元素(例如,再次遍历列表,保留单独的列表等)。这似乎是为了学习,所以我怀疑性能是否值得关注。@JaredC:经过思考,有一种方法可以实现一个循环,而不会让它非常痛苦(比如n*n)。好吧,这对我来说已经足够好了
temp2 = head;
while(temp2->next != temp)
temp2 = temp2->next;
void printReverse()
{
printReverse(head) //kickstart the overload function below
}
void printReverse(node *n)
{
if(n == 0) return;
printReverse(n->next); //print the next
cout << n->data << endl; //before printing me
}
for(double count = countItems() / 2; count != 0; --count)
{
//Set temp2 before temp
temp2 = head;
while(temp2->next != temp)
temp2 = temp2->next;
cout << temp2->data<< " " << endl;
//Set temp before temp2
temp = head;
while(temp->next != temp2)
temp = temp->next;
cout << temp->data << " "<< endl;
}
cout << "EXIT LOOP" << endl;
void print() {
node *temp;
temp= head;
while (temp != NULL) {
cout << temp->data << " ";
temp = temp->next;
}
}