改写要求1:改写为以单链表和双向链表存储二维数组

改写要求2:添加函数SingleLinkProcess()实现互换单链表中最大结点和头结点位置,最小结点和尾结点位置

改写要求3:添加函数DoubleLinkProcess()实现互换双向链表中最大结点和头结点位置,最小结点和尾结点位置

#include <cstdlib>
#include <iostream> using namespace std;
#define M 3
#define N 4 struct SingleLink
{
int Row;
int Column;
int Data;
SingleLink *next;
}; struct DoubleLink
{
int Row;
int Column;
int Data;
DoubleLink *prior;
DoubleLink *next;
};
class Matrix
{
int a[M][N];
public:
SingleLink* creatSingle(int a[][N]);
DoubleLink* creatDouble(int a[][N]);
void SingleLinkProcess(SingleLink* Shead);
void DoubleLinkProcess(DoubleLink* Dhead);
void showSingle(SingleLink* Shead)
{
SingleLink* p=Shead->next;
int i=;
while(p)
{
cout<<p->Data<<'\t';
i++;
if(i%==)
cout<<endl;
p=p->next;
}
cout<<endl;
}
void showDouble(DoubleLink* Dhead)
{
DoubleLink* p=Dhead->next;
int i=;
while(p)
{
cout<<p->Data<<'\t';
i++;
if(i%==)
cout<<endl;
p=p->next;
}
cout<<endl;
}
void showDoublePrior(DoubleLink* Dhead)
{
DoubleLink* p=Dhead->next;
DoubleLink* t;
while(p)
{
t=p;
p=p->next;
}
int i=;
while(t)
{
cout<<t->Data<<'\t';
i++;
if(i%==)
cout<<endl;
t=t->prior;
}
cout<<endl;
}
}; SingleLink* Matrix::creatSingle(int a[][N])
{
SingleLink* Shead=new SingleLink;
Shead->next=NULL;
SingleLink *p;
p=Shead;
int i,j;
for(i=;i<M;i++)
for(j=;j<N;j++)
{
SingleLink* newSingleLink=new SingleLink;
newSingleLink->next=NULL;
newSingleLink->Data=a[i][j];
newSingleLink->Row=i;
newSingleLink->Column=j;
p->next=newSingleLink;
p=newSingleLink;
}
return Shead;
} void Matrix::SingleLinkProcess(SingleLink* Shead)
{
SingleLink* max,*maxpre,*maxtail,*hpre,*htail,*head,*ppre;
SingleLink* min,*minpre,*mintail,*tpre,*tail;
SingleLink* p,*q;
p=Shead->next;
max=p;
head=p;
hpre=Shead;
htail=head->next;
ppre=p;
while(p)
{ if(max->Data<p->Data)
{
max=p;
maxpre=ppre;
maxtail=p->next;
}
ppre=p;
p=p->next;
}
hpre->next=max;
maxpre->next=head;
head->next=maxtail;
max->next=htail; p=Shead->next;
int i=M*N-; while(i)
{
tpre=p;
p=p->next;
tail=p;
i--;
}
p=Shead->next;
min=p;
ppre=p;
while(p)
{ if(min->Data>p->Data)
{
min=p;
minpre=ppre;
mintail=p->next;
}
ppre=p;
p=p->next;
}
minpre->next=tail;
tpre->next=min;
tail->next=min->next;
min->next=NULL;
} DoubleLink* Matrix::creatDouble(int a[][N])
{
DoubleLink* Dhead=new DoubleLink;
Dhead->next=NULL;
Dhead->prior=NULL;
DoubleLink* p=Dhead;
int i,j;
for(i=;i<M;i++)
for(j=;j<N;j++)
{
DoubleLink* newDoubleLink=new DoubleLink;
newDoubleLink->prior=NULL;
newDoubleLink->next=NULL;
newDoubleLink->Data=a[i][j];
newDoubleLink->Row=i;
newDoubleLink->Column=j;
p->next=newDoubleLink;
newDoubleLink->prior=p;
p=newDoubleLink;
}
return Dhead;
} void Matrix::DoubleLinkProcess(DoubleLink* Dhead)
{
DoubleLink* max,*maxpre,*maxtail,*hpre,*htail,*head;
DoubleLink* min,*minpre,*mintail,*tail,*tpre;
DoubleLink* p;
p=Dhead->next;
head=p;
hpre=Dhead;
htail=head->next;
max=p;
while(p)
{
if(max->Data<p->Data)
{
max=p;
maxpre=p->prior;
maxtail=p->next;
}
p=p->next;
}
hpre->next=max;
max->prior=hpre;
max->next=htail;
htail->prior=max;
maxpre->next=head;
head->prior=maxpre;
head->next=maxtail;
maxtail->prior=head; p=Dhead->next;
while(p)
{
tail=p;
p=p->next;
}
p=Dhead->next;
min=p;
tpre=tail->prior;
while(p)
{
if(min->Data>p->Data)
{
min=p;
minpre=p->prior;
mintail=p->next;
}
p=p->next;
}
if(tpre==min)//结点是否相邻要分开处理
{
minpre->next=tail;
tail->prior=minpre;
tail->next=min;
min->prior=tail;
min->next=NULL;
}
else{
minpre->next=tail;
tail->prior=minpre;
tail->next=mintail;
mintail->prior=tail;
tpre->next=min;
min->prior=tpre;
min->next=NULL;
}
} int main(int argc, char *argv[])
{
int b[M][N]={{,,,},{,,,},{,,,}};
SingleLink* Shead;
DoubleLink* Dhead;
Matrix ma;
Shead=ma.creatSingle(b);
ma.showSingle(Shead);
ma.SingleLinkProcess(Shead);
ma.showSingle(Shead); Dhead=ma.creatDouble(b);
ma.showDouble(Dhead);
ma.DoubleLinkProcess(Dhead);
ma.showDouble(Dhead);
system("PAUSE");
return EXIT_SUCCESS;
}

C++程序设计实践指导1.10二维数组元素换位改写要求实现的更多相关文章

  1. C++程序设计实践指导1.2二维数组的操作运算改写要求实现

    改写要求1:改写为以单链表表示二维数组 #include <cstdlib> #include <iostream> using namespace std; struct L ...

  2. C++程序设计实践指导1.3求任意整数降序数改写要求实现

    改写要求1:动态生成单链表存储 #include <cstdlib> #include <iostream> using namespace std; struct LinkN ...

  3. C++程序设计实践指导1.15找出回文数改写要求实现

    改写要求1:用单链表实现 #include <cstdlib> #include <iostream> using namespace std; struct LinkNode ...

  4. C++访问二维数组元素

    if(*image_in+j*+xsize+i)>=thresh)//xsize图像宽度 image_out是首地址,加上j*行宽就是目标行的首地址,再加上i,就是在此行中的第i个像素,所以整个 ...

  5. C++二级指针第二种内存模型(二维数组)

    C++二级指针第二种内存模型(二维数组) 二维数组 二维数组本质上是以数组作为数组元素的数组,即“数组的数组”. 定义 类型说明符 数组名[常量表达式][常量表达式] 例如: float a[3][4 ...

  6. 【学习笔记】【C语言】二维数组

    1. 什么是二维数组 一个数组能表示一个班人的年龄,如果想表示很多班呢? 什么是二维数组?int ages[3][10]; 三个班,每个班10个人 相当于3行10列 相当于装着3个一维数组 二维数组是 ...

  7. Java数组之二维数组

    Java中除了一维数组外,还有二维数组,三维数组等多维数组.本文以介绍二维数组来了解多维数组. 1.二维数组的基础 二维数组的定义:二维数组就是数组的数组,数组里的元素也是数组. 二维数组表示行列二维 ...

  8. 第3章 Java数组(上): 一维数组和二维数组

    3.数组及排序算法(2天) 3.1 数组的概述 2课时 3.2 一维数组的使用 3课时 3.3 多维数组的使用 3课时 3.4 数组中涉及到的常见算法 3课时 3.5 Arrays工具类的使用 3课时 ...

  9. C/C++——二维数组与指针、指针数组、数组指针(行指针)、二级指针的用法

    本文转载自:https://blog.csdn.net/qq_33573235/article/details/79530792 1. 二维数组和指针 要用指针处理二维数组,首先要解决从存储的角度对二 ...

随机推荐

  1. Mac添加或修改环境变量

    方式1. 终端添加或修改 命令:pico, vim等 方式:pico .bash_profile 方式2. 文本方式添加或修改 1)打开 touch ~/.bash_profile open -t ~ ...

  2. mysql grant all privileges on

    遇到了 SQLException: access denied for @'localhost' (using password: no) 解决办法 grant all privileges on * ...

  3. oracle 10g RAC psu过程

    1 升级crs 至10.2.0.5.2 1) 升级opatch 程序,PSU对opatch的版本有要求,详见readme文件,此步操作共涉及到每个节点的ORACLE_HOME和ORA_CRS_HOME ...

  4. WordPress插件制作教程(五): 创建新的数据表

    上一篇讲解了怎样将数据保存到数据库,今天为大家讲解创建新的数据表,也就是说当我们激活插件的时候,会在该数据库下面创建一个新的数据表出来.原理很简单,激活插件的时候运行创建数据库的代码.看下面代码: & ...

  5. python之6-4装饰器.md

    装饰器看的说实话真心郁闷,群里一伙计说了好一会,听得一愣一愣的,查了点资料,又自己试了下,算是明白了一些,记录记录=.=更郁闷的是,博客园的markdown标记支持怎么和为知的不匹配,这转过来的文章很 ...

  6. ACM ICPC Team

    Link: https://www.hackerrank.com/challenges/acm-icpc-team/submissions/code/11617807 def count_max_to ...

  7. [iOS常见问题] 关于使用QQ做第三方登录的问题!

    [iOS常见问题] 关于使用QQ做第三方登录的问题! 注意:QQ本身没有授权功能,所以想要使用QQ做第三方登录必须通过QQ空间来实现! 第一步:集成ShareSDK(步骤同集成分享的一样,如果已经集成 ...

  8. 一种基于C51单片机的非抢占式的操作系统架构

    摘 要:从Keil C51的内存空间管理方式入手,着重讨论实时操作系统在任务调度时的重入问题,分析一些解决重入的基本方式与方法:分析实时操作系统任务调度的占先性,提出非占先的任务调度是能更适合于Kei ...

  9. [Android]通过setImageURI设置网络上面的图片

    设置imageView显示网络上的图片 picUrl = new URL(getIntent().getExtras().getString("map_url")); Bitmap ...

  10. mybatis批量update(mysql)

    Mapper文件中的写法 <insert id="batchUpdateTjData"> <foreach collection="list" ...