#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define Status int
#define ElemType int
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
#define MAXSIZE 100
typedef struct{
ElemType *elem; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量
ElemType data[MAXSIZE];
}SqList;
//创建顺序表
Status InitList_sq(SqList &L)
{
//初始化顺序表
L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem) //存储分配失败
exit(OVERFLOW);
L.length=0; //初始长度0
L.listsize=LIST_INIT_SIZE; //初始容量
return OK;
}
void CreateList(SqList &L,int n){
int elem;
for(int i=0;i<n;i++){
scanf("%d",&elem);
L.data[i]=elem;
L.length++;
}
}
//数据元素的插入
Status ListInsert_sq(SqList &L,int i,ElemType e)
{
//插入记录到顺序表
if(i<1 || i>L.length+1)
{
printf("输入的值不合法\n");
return ERROR; //i的值不合法
}
if(L.length>=L.listsize) //增加分配
{
ElemType *newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase) exit(OVERFLOW); //存储分配失败
L.elem=newbase; //新基址
L.listsize+=LISTINCREMENT; //增加存储容量
}
ElemType *q = &(L.elem[i-1]); //q为插入位置
for(ElemType *p=&(L.elem[L.length-1]);p>=q;--p) //p指向最后一个元素的位置
*(p+1) = *p; //插入位置及之后的元素右移
*q = e; //插入e
++L.length;
return OK;
}
void Insert(SqList &L) //插入
{
char c;
ElemType e;
int i;
do
{ printf("请输入需要插入顺序表L中的整数:");
scanf("%d",&e);
do
{
i=L.length;
printf("\n请输入要插入的位置(1 ~ %d):",i+1);
scanf("%d",&i);
}while(ListInsert_sq(L,i,e)==0); //插入位置不正确
printf("\n是否继续输入(按y继续)?");
c=getche();
putchar('\n');
}while(c=='y');
}
//数据元素的删除
Status ListDelete_Sq(SqList &L,int i,ElemType &e){
//在线性顺序表中删除第i个元素,并用e返回其值
//i的合法值为1<=i=<ListLength_Sq(L)
if ((i<1) || (i>L.length))
{
printf("输入不合法!!!");
return ERROR;
}
ElemType *p = &(L.elem[i-1]);
e = *p; //将被删除元素赋值给e
ElemType *q = L.elem+L.length-1; //表尾元素
for(++p; p<= q; ++p) //被删除元素之后的元素后移
*(p-1) = *p;
--L.length; //表长减1
return OK;
}
void Delete(SqList &L)
{
//删除指定位置
ElemType a;
int i;
printf("\n请输入删除位置(不合法则退出):");
scanf("%d",&i);
while(i>0)
{
if(ListDelete_Sq(L,i,a)!=0) //如果成功删除
printf("您删除了%d\n",a);
printf("\n请输入正确的删除位置:");
scanf("%d",&i);
}
}
//数据元素的定位算法
void LocateElem_Sq(SqList L, ElemType e)
{
int i = 0;
ElemType *p;
p = L.elem;
while (i<= L.length-1 && (*p++)!=e) i++;
if (i<=L.length-1) printf("元素%d的位置序号是%d\n",e,i+1);
else printf("元素%d不存在\n",e);
}
//两个有序表的归并
void Combination(SqList &L,SqList &L1,SqList &L2){
int i=0,j=0,k=0;
while((i!=L.length)&&(j!=L2.length)){
if(L.data[i]>L1.data[j]){
L2.data[k++]=L1.data[j++];
}
else{
L2.data[k++]=L.data[i++];
}
L2.length++;
}
while(i<L.length)
{
L2.data[k++]=L.data[i++];
L2.length++;
}
while(j<L1.length){
L2.data[k++]=L1.data[j++];
L2.length++;
}
}
//输出顺序表L2
void display(SqList &L){
for(int i=0;i<L.length;i++){
printf("%d ",L.data[i]);
}
printf("\n");
}
int main()
{
int n;
int a;
printf("请设置顺序表的元素个素:");
scanf("%d",&n);
SqList L,L1,L2;
//自动初始化顺序表
InitList_sq(L);
InitList_sq(L1);
InitList_sq(L2);
//顺序表的创建
printf("\n创建顺序表L(请输入元素)");
CreateList(L,n);
printf("\n创建顺序表L1(请输入元素)\n");
CreateList(L1,n);
printf("\n数据元素的插入");
Insert(L);
printf("数据元素的删除");
Delete(L);
printf("\n顺序表L与顺序表L1合并得L2\n");
Combination(L,L1,L2);
printf("输出顺序表L2\n");
display(L2);
printf("数据元素的定位\n");
printf("请输入需要查找的元素:");
scanf("%d",&a);
LocateElem_Sq(L,a);
return 0;
}
请列出你的输入, 以及出现了什么错误?