顺序表-数据结构

1.设A、B均为用数组实现的List类型的顺序表,试设计一个函数Alternate(A,B),从表A中第1个元素开始,交替地用表A和表B中元素组成一个新表。

 

/************************************************************************/

/*2-1 设A、B均为用数组实现的List类型的顺序表,试设计一个函数Alternate(A,B),

从表A中第1个元素开始,交替地用表A和表B中元素组成一个新表。                                             */

/************************************************************************/

 

 

 

 

#include "iostream"

using std::cout;

using std::cin;

using std::endl;

 

 

typedef int STATUS;

 

 

class List

{

public:

       List(){i_list = NULL;}

       void initList(int maxLength);                   //初始化列表

       STATUS islistnull();                                 //判断列表是否为空          //本题可不用此功能

       void insertAtLast(int num);                            //插入数字

       void Alternate(List &listB,List &listC);//交替地用表A和表B中元素组成一个新表

       void display();

       void destroyList();                                          //销毁列表

       int getNowListLength();                                 //返回列表长度           //本题可不用此功能

       void inputArrays(int x);                          //批量输入x个元素

       void setNow(int i);                                          //设置标志位置

       ~List(){destroyList();}

 

       int *i_list;                    //列表

 

private:

       int now;                      //列表当前位置标志

       int maxLength;                   //最大列表长度

};

 

 

void List::initList(int max)

{

       i_list = new int[max];

       if (!i_list)

       {

              cout<<"内存分配失败!"<<endl;

              exit(0);

       }

       else

       {

              cout<<"分配内存成功,首地址为:"<<i_list<<endl;

 

 

              maxLength = max;

              now = 0;

       }

}

STATUS List::islistnull()     //本题可不用此功能

{

       if(!now)

              return 1;

       else

              return 0;

}

 

 

void List::insertAtLast(int num)

{

       if (now>maxLength)

       {

              cout<<"列表已达到最大长度!+++"<<endl;

              exit(0);

       }

       else

              i_list[now++] = num;   //复制并向下移动标志

}

 

 

void List::Alternate(List &listB,List &listC)

{

//     List listC;

       //初始化列表C

       int maxListLength = now + listB.now;

       listC.initList(maxListLength);

       int ai = 0,bi = 0,ci = 0;

       while(ai<now && bi<listB.now)

       {

              listC.i_list[ci++] = i_list[ai++];

              listC.i_list[ci++] = listB.i_list[bi++];

            

              

/*           if (i_list[ai] != listB.i_list[bi])

              {

                     listC.i_list[ci++] = i_list[ai++];

                     listC.i_list[ci++] = listB.i_list[bi++];

              }

              else

                     listC.i_list[ci++] = i_list[ai++];

*/    }

       while(ai<now)

       {      listC.i_list[ci++] = i_list[ai++];   }

       while(bi<listB.now)

       {      listC.i_list[ci++] = listB.i_list[bi++];  }

     

       listC.setNow(maxListLength);    //设置列表C的当前长度为maxListLength

 

//     return listC;

 

 

}

 

 

void List::display()

{

       cout<<"当前列表所有元素:";

       int i;

       for (i = 0; i<now; i++)

       {

              cout<<i_list[i]<<' ';

       }

       cout<<endl;

 

 

}

 

 

void List::destroyList()

{

       if (i_list)

       {

              delete [] i_list;

              i_list = NULL;

       }

}

int List::getNowListLength()     //本题可不用此功能

{

       return now;

}

void List::inputArrays(int x)

{

       int i;

       int temp;

       cout<<"批量输入"<<x<<"个元素."<<endl;

       if (now>maxLength)

       {

              cout<<"列表已达到最大长度!"<<endl;

              exit(0);

       }

       else if (now + x >maxLength)

       {

              cout<<"错误!添加后超过列表最大长度!"<<endl;

              exit(0);

       }

       else

       {

              for (i = 0; i<x; i++)

              {

                     cin>>temp;

                     insertAtLast(temp);

              }

       }

}

void List::setNow(int i)

{

       now = i;

       cout<<"列表当前位置标志设置成功:"<<now<<endl;

}

 

 

int main()

{

       List myListA,myListB,myListC;

       cout<<"请输入想要创建的列表A and B的最长度:";

       int ia,ib;

       cin>>ia;

       cin>>ib;

       //A

       cout<<"********列表A********"<<endl;

       myListA.initList(ia);

       myListA.inputArrays(ia);

       myListA.display();

       //B

       cout<<"********列表B********"<<endl;

       myListB.initList(ib);

       myListB.inputArrays(ib);

       myListB.display();

       //交替地用表A和表B中元素组成一个新表

       //C

       cout<<"********列表C********"<<endl;

       myListA.Alternate(myListB,myListC);

 

 

//     利用返回类失败...改用参数的引用

//     myListC = myListA.Alternate(myListB);

//     myListC.i_list = myListA.Alternate(myListB);

       myListC.display();

       system("pause");

       return 0;

}

 

2.实现算法将一个顺序表中从第i个结点开始连续插入k个结点。

 

/************************************************************************/

/*2-2【要求】实现算法将一个顺序表中从第i个结点开始连续插入k个结点。              */

/************************************************************************/

#include "stdio.h"

#include "malloc.h"

 

#define LIST_INIT_SIZE   10

#define LISTINCREMENT   5

 

typedef int ElemType;

 

typedef  struct{

       ElemType *elem;

       int length;

       int ListSize;

} sqlist;

 

//对列表L初始化

//成功返回1,失败返回0;

int InitList_sq(sqlist *L)  /*initial the list l*/

{

       L->elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));

       if (!L->elem)

       {

              printf("无法分配空间...");

              return 0;

       }

       else

       {

              L->length = 0;

              L->ListSize = LIST_INIT_SIZE;

              printf("ok!内存空间分配成功...\n");

              return 1;

       }

}

 

 

//ListInsert_Sq():像列表L的第i个位置插入元素e;

//成功返回1,失败返回0;

int ListInsert_Sq(sqlist *L,int i, ElemType e)

{

       ElemType *q;       //q:想要插入位置的地址

       ElemType *p;       //p:向后移动当前列表长度L->length-1

     

       if(i<1 || i>L->length+1)

              return 0;

       if(L->length >= L->ListSize)

       {

              ElemType *newbase;

              //重新分配内存空间

              //新列表L长度L->ListSize+LISTINCREMENT

              newbase = (ElemType *)realloc(L->elem, (L->ListSize+LISTINCREMENT)*sizeof(ElemType));

              if(!newbase)

                     return 1;

              L->elem=newbase;

              L->ListSize += LISTINCREMENT;

       }

       //q想要插入位置的地址

       q = &(L->elem[i-1]);    //简化: q = L->elem + i-1 ?

       for(p = &(L->elem [L->length-1]); p>=q; --p)

              *(p+1) = *p;

       *q = e;

 

       printf("当前列表长度为:%d\n",++L->length);

 

       return 1;

}

 

//实现算法将一个顺序表L中从第i个结点开始连续插入k个结点

//成功返回1,失败返回0;

int InsertArrays(sqlist *L, int i,int k)

{

       printf("当前列表长度为:%d\n",L->length);

       int cnt,temp_i;

       printf("输入要插入的%d个元素:\n",k);

       for (cnt = 0; cnt<k; cnt++)

       {

              printf("第%d个元素:",cnt+1);

              scanf("%d",&temp_i);

              if (!ListInsert_Sq(L,i++,temp_i))

              {

                     printf("插入第%d个元素%d失败!\n:",cnt+1,temp_i);

                     return 0;

              }

       }

 

       return 1;

}

 

//输出列表L的元素

void displayList(sqlist *L)

{

       int i;

       printf("当前列表所有的元素:\n");

       for (i = 0; i<L->length; i++)

       {

              printf("%d ",L->elem[i]);

       }

       printf("\n");

}

 

void InsterProcess(sqlist *L)

{

       //ListInsert_Sq(&myList,1,0);

       int i;       //第i个结点

       int k;      //连续插入k个结点

       printf("实现算法将一个顺序表中从第i个结点开始连续插入k个结点.\n");

       printf("输入i:"); scanf("%d",&i);

       printf("输入k:");       scanf("%d",&k);

       InsertArrays(L,i,k);

     

}

 

int main()

{

       sqlist myList;

       InitList_sq(&myList);

//     InsterProcess(&myList);

       int sel;

       int c;

 

       while (1)

       {

//            system("cls");

              printf("<1>插入元素\n");

              printf("<2>显示元素\n");

              scanf("%d",&c);

              switch (c)

              {

              case 1:

                     InsterProcess(&myList);break;

              case 2:

                     displayList(&myList);break;

              default:

                     printf("输入错误!\n");

              }

       }

 

       return 0;

}

 

posted on 2013-05-01 21:16  _H  阅读(284)  评论(0编辑  收藏  举报