问题简单,概念疑惑,求大神

图片说明
我想要这个题的完整解答。我自学c++和数据结构,无法理解链表,每次使用链表时都要自己创建,自己写函数输入输出?没有现成的函数?工具书上的源代码只是一个例子?

5个回答

 #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
输出:倒序及正序字符串图片说明

dabocaiqq
请你们大家多多姿瓷我菠菜菌 简化的代码比我不简化的还长,请教你的代码简化在哪里?
一年多之前 回复
qq_37416556
alaboboy 回复caozhy: 时间空间是肯定要打折扣的,不过相对方便管理一点,实质是简化而不是繁琐,要不就没有学习堆栈的必要了
一年多之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 没有必要用堆栈,时间空间都不优,还繁琐。
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!