我想要这个题的完整解答。我自学c++和数据结构,无法理解链表,每次使用链表时都要自己创建,自己写函数输入输出?没有现成的函数?工具书上的源代码只是一个例子?
#include "stdio.h"
struct ListNode {
int val;
struct ListNode *next;
};
ListNode* ReverseList(ListNode* pHead) {
ListNode* newh = NULL;
ListNode* p = pHead;
while(p)
{
ListNode* tmp = p -> next;
p -> next = newh;
newh = p;
p = tmp;
}
return newh;
}
void PrintList(ListNode* pHead) {
while (pHead)
{
printf("%d ", pHead->val);
pHead = pHead->next;
}
printf("\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
ListNode p5; p5.val = 5; p5.next = NULL;
ListNode p4; p4.val = 4; p4.next = &p5;
ListNode p3; p3.val = 3; p3.next = &p4;
ListNode p2; p2.val = 2; p2.next = &p3;
ListNode p1; p1.val = 1; p1.next = &p2;
PrintList(&p1);
ListNode* newlist = ReverseList(&p1);
PrintList(newlist);
return 0;
}
运行结果如图
稍微解释下这个程序的原理:
有链表 1->2->3->4->5->NULL
我们遍历它,创建新的链表,每次都把原来的链表节点插入新链表的头上。
第一次循环
newh是 1->NULL
第二次循环
newh是 2->1->NULL
第三次循环
newh是 3->2->1->NULL
第四次循环
newh是 4->3->2->1->NULL
第五次循环
newh是 5->4->3->2->1->NULL
然后返回newh
完整的代码:https://download.csdn.net/download/dabocaiqq/10470252
如果回答满意,请点我回答右边的采纳,谢谢。
话说你给的题比较适合用”栈“来实现
现成的函数的话stack.h头文件可以试着学着用一下
但是还是建议你自己编,毕竟编完之后自己用运用要比用库函数熟练得多
下面是用现编linknode和push方法解题代码
#include <iostream>
#include <conio.h>
using namespace std;
template <class T>
class LinkNode
{
public:
T data;
LinkNode<T>*prev;
LinkNode<T>*next;
LinkNode(const T&el = NULL,LinkNode<T>*ptr = 0,LinkNode<T>*pt = 0)
{
data=el;
prev=ptr;
next=pt;
};
};
template <class T>
class LinkStack
{
private:
LinkNode <T> *top;
LinkNode <T> *rear;
public:
LinkStack()
{
top=rear=new LinkNode<T>();
}
~LinkStack(){
Clear();}
void Clear()
{
while (top != rear)
{
LinkNode <T> *tmp =top;
top=top->prev;
delete tmp;
}
}
bool Push(const T item)
{
LinkNode <T> *tmp =new LinkNode<T>(item,top);
top->next=tmp;
top=tmp;
return true;
}
bool Pop(T & item)
{
LinkNode<T> *tmp;
if (top==rear)
{
return false;
}
item = top->data;
tmp=rear->next;
delete rear;
rear =tmp;
return true;
}
void print()
{
LinkNode<T> *tmp =top;
while(tmp!=rear)
{
cout<<tmp->data<<" ";
tmp=tmp->prev;
}
cout<<endl;
}
};
int main()
{int n,i,c;
cout<<"输入n"<<endl;
cin>>n;
int aa;
LinkStack <int>a[10];
for(i=0;i<n;i++)
{
cin>>c;
if(c>=0 && c<10)
a[c].Push(c);
else
{
cout<<"第"<<i+1<<"次输入错误,算作无效输入"<<endl;
i--;
}
}
LinkStack <int>b;
for(i=9;i>=0;i--)
{a[i].print();
while(a[i].Pop(c))
b.Push(c);
}
b.print();
getch();
}
输入:5(数字数目) 1 2 3 4 5
输出:倒序及正序字符串