顺序表-数据结构
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;
}