C++程序设计实践指导1.10二维数组元素换位改写要求实现

改写要求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=0;
                  while(p)
                  {
                          cout<<p->Data<<‘\t‘;
                          i++;
                          if(i%4==0)
                          cout<<endl;
                          p=p->next;
                  }
                  cout<<endl;
             }
             void showDouble(DoubleLink* Dhead)
             {
                  DoubleLink* p=Dhead->next;
                  int i=0;
                  while(p)
                  {
                          cout<<p->Data<<‘\t‘;
                          i++;
                          if(i%4==0)
                          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=0;
                  while(t)
                  {
                          cout<<t->Data<<‘\t‘;
                          i++;
                          if(i%4==0)
                          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=0;i<M;i++)
          for(j=0;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-1;

     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=0;i<M;i++)
     for(j=0;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]={{1,4,5,6},{7,2,10,11},{8,9,12,3}};
    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;
}
时间: 2024-10-02 02:50:35

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

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

改写要求1:改写为以单链表表示二维数组 #include <cstdlib> #include <iostream> using namespace std; struct LinkNode { int Row; int Column; int Data; LinkNode *next; }; class MATRIX { int m; int sum; public: struct LinkNode* creat(int x[][40],int k) { m=k; LinkNod

编程题:指向二维数组元素的指针变量。功能:已知二维数组a[2][3],输入输出全部元素。

#include<stdio.h> void main() { int a[2][3],i,j; int *p; /*用坐标法输入二维数组元素*/ for(i=0;i<2;i++) for(j=0;j<3;j++) scanf("%d",&a[i][j]); /*用指针法输出二维数组元素*/ p=a[0];         /*等价于p&a[0][0];*/ for(;p<a[0]+6;p++)   printf("%4d&quo

10 二维数组

排序算法: 1.存储介质 可靠,稳定,海量,稳定 2.数据结构 3.样本分布 随机访问:访问每处的代价成本均等 RAM Random Access Memory ROM Random Read Only Memory 选择法需要支持随机访问,在这个场合下,选择由于冒泡 冒泡是在顺序访问场合的时候,此时冒泡由于选择 对抗中想要四两拨千斤: 1.对手犯了致命错误 2.自己水平远高于对方 要做到: 设计思路清晰,写代码快 分析思路清晰,读代码快 二维数组和多维数组本质上还是一维数组 若数组type a

二维数组元素排序

<script type="text/javascript">//--------------------------1数值排序-------------------------var arr1=[[22,33,44],[1,0,6,2],[33,10],[10,5]];arr1.sort(function(x,y){ return x[1] -y[1];//按照二维数组arr1中每个数组元素(数组)的第二个元素升序排列 });console.log(arr1); //--

用指针实现对二维数组元素的访问

在C语言中,多维数组实际上是数组的数组,二维数组就是每个元素都是一个一维数组的一维数组. 例如a[3][4]: 定义了一个3行4列的二维数组,可以将a看成是有a[0].a[1].a[2]三个元素组成的一维数组,而每个元素a[i]都是一个有4个整形元素的数组. 1 #include<stdio.h> 2 3 int main() 4 { 5 int i, j, a[4][3] = {{1,2,3},{4,5,6},{7,8,9},{10,11,12}}, *p; 6 p = &a[0][

指向二维数组元素的指针变量

(1)指向数组元素的指针变量 例1.有一个3X4的二维数组,要求用指向元素的指针变量输出二维数组各元素的值. 编写程序 1 #include <stdio.h> 2 int main() 3 { 4 int a[3][4] = { 1,3,5,7,9,11,13,15,17,19,21,23 }; 5 int *p; 6 for (p = a[0]; p < a[0] + 12; p++) //a[0]代表列指针的起点,p依次指向下一个元素 7 { 8 if ((p - a[0])%4

二维数组元素及其地址表示的完美解读

一,二维数组的架构与逻辑 1.a[3][4] = {a[0], a[1], a[2]} ={{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}; 二维m×n  -->  m个一维数组  -->  每个一维数组包含n个元素 不废话,直接看图 2,确定的公式 a[0] = a[0]+0 = &a[0][0] = *(a+0)+0 = *a a = &a[0] = &(&a[0][0]) = &(*a) a; 二, 二维数

二维数组元素的地址

一维数组元素的地址大家都比较容易理解,但对于二维数组,就很容易搞混了.今天我又被这个问题给弄糊涂了,翻了翻老谭的书本,对这个问题有了更深的认识. 首先给出一个二维数组a,它的定义为: int a[3][4] = {{1,3,5,7}, {9,11,13,15}, {17,19,21,23}}; a数组包含3个行元素,a[0],a[1],a[2].而每个行元素又是一个一维数组,它包含4个元素. 从二维数组的角度来看,a代表二维数组首元素的地址,现在的首元素不是简单的整型,而是由4个整型元素所组成的

c语言之指向二维数组元素的指针变量

如何使用指针对二维数组进行遍历? 首先我们需要明确的是:二维数组在内存中是连续的,比如一个二维数组int a[2][3]={1,2,3,4,5,6},可以视作是两个一维数组构成的,即int a0[3] ={1,2,3},int a1[3] = {4,5,6},我们知道,一维数组在内存中是连续的一块内存,并且数组名a0,a1代表的就是该数组首元素的地址,而正因为二维数组的内存中的地址也是连续的,所以a1的首元素的地址就为a0数组首元素的地址+a0中元素的个数,因此,我们就可以通过让指针不断+1来访