ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++中链表反转2

2022-02-24 19:03:44  阅读:202  来源: 互联网

标签:stuList 反转 C++ 链表 pCur pPre ph pNext


引言

周期按我也写过类似链表反转的文章,这个链表反转是在第二次写的时候写的,由于都是靠当时的思路,两个在代码实现上有所差异,仅以记录。

示例

编程环境

在vs2010下编写的C++控制台输出程序,只改动了main.cpp,其它默认生成。

代码实现

下面是main.cpp中的代码实现。

// testReverseList2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <stdlib.h>

using namespace std;

/************************************************************************/
/* 功能:
stuList *reverseList(stuList *ph)              将链表反转,返回指向反转后的链表
stuList * createList(vector<int> &nVec)        创建链表,返回创建的链表
void outPut(vector<int> &vec)                  输出动态数组中的元素
void fromControlGetNum(vector<int> &nVec)      控制台输入数值,存入到动态数组中,直到输入回车键停止输入
void outPutList(stuList *ph)                   输出链表中结点的值*/
/************************************************************************/

struct stuList{
    int data;
    stuList *pNext;
};

stuList * createList(vector<int> &nVec){
   int nSize = nVec.size();
   int i = 0;
   stuList *ph,*pPre,*pCur;
   while (i < nSize)
   {
       pCur = new stuList;
       if (pCur)
       {
           pCur->data = nVec[i];
           pCur->pNext = nullptr;
           if(i == 0){
               ph = pCur;
               pPre = pCur;
           }else{
               pPre->pNext = pCur;
               pPre = pCur;
           }
           ++i;
       }
   }
   return ph;
}

stuList *reverseList(stuList *ph){
    stuList *pCur,*pPre,*pFont;
    int i= 0;
    pPre = ph;
    pCur = ph->pNext;

    if(pCur->pNext != nullptr){//3个或者3个以上结点
        pFont = pCur->pNext;
        while (pFont != nullptr)
        {
            if(i == 0){
                pPre->pNext = nullptr;
            }
            pCur->pNext = pPre;
            pPre = pCur;
            pCur = pFont;
            if (pFont->pNext != nullptr)
            {
                pFont = pFont->pNext;
            } 
            else
            {
                pCur->pNext = pPre;
                break;
            }
            ++i;
        }
    }else{//只有2个结点
        pPre->pNext = nullptr;
        pCur->pNext = pPre;
    }

    return pCur;
}


void outPut(vector<int> &vec){
    for (int i = 0; i < vec.size(); ++i)
    {
        cout<<vec[i]<<"\t";
    }
    cout<<endl;
}

void fromControlGetNum(vector<int> &nVec){
    int num;
    cout<<"请输入创建链表的值:"<<endl;
    do 
    {
        cin>>num;
        nVec.push_back(num);
    } while (cin.get() != '\n');//当输入回车的时候,停止输入,但是前一个为空格再回车就不能结束输入
}

void outPutList(stuList *ph){
    while (ph != nullptr)
    {
        cout<<ph->data<<"\t";
        ph = ph->pNext;
    }
    cout<<endl;
}


int _tmain(int argc, _TCHAR* argv[])
{
    vector<int> nVec;
    fromControlGetNum(nVec);
    cout<<"输入的数组输出如下:"<<endl;
    outPut(nVec);
    stuList * phList = createList(nVec);
    cout<<"链表输出如下:"<<endl;
    outPutList(phList);
    stuList *pReList = reverseList(phList);
    cout<<"链表反转后输出如下:"<<endl;
    outPutList(pReList);

    system("pause");

	return 0;
}

运行结果

创建2个结点的链表输出结果:
在这里插入图片描述
输入3个或者多于3个结点的链表的输出结果:
在这里插入图片描述

标签:stuList,反转,C++,链表,pCur,pPre,ph,pNext
来源: https://blog.csdn.net/blqzj214817/article/details/123118378

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有