#include <stdio.h>
#include <stdlib.h>
typedef int elemType;
struct List{
elemType *list;
int size;
int maxsize;
};
void againMalloc(struct List *L);/*0.扩展函数*/
void initList(struct List *L, int ms);/*1.初始化线性表函数*/
void clearList(struct List *L);/*2.清除线性表函数*/
int sizeList(struct List *L);/*3.返回线性表长度函数*/
int emptyList(struct List *L);/*4.判定线性表是否为空函数*/
elemType getElem(struct List *L, int pos);/*5.返回线性表L中第pos个元素的值,若pos超出范围,则停止程序运行*/
void traverseList(struct List *L);/*6.遍历输出线性表L中每个元素*/
int findList(struct List *L, elemType x);/*7.查找线性表L中与x相等元素并返回其位置,否则返回-1*/
int updatePosList(struct List *L, int pos, elemType x);/*8.把线性表L中第pos个元素的值修改为x的值,若修改成功返回1,否则返回0*/
void inserFirstList(struct List *L, elemType x);/*9.向线性表L的表头插入元素x*/
void insertLastList(struct List *L, elemType x);/* 10.向线性表L的表尾插入元素x*/
int insertPosList(struct List *L, int pos, elemType x);/*11.向线性表L中第pos个元素位置插入元素x,若插入成功返回1,否则返回0*/
void insertOrderList(struct List *L,int pos, elemType x);/*12.向有序线性表L中插入元素x, 使得插入后仍然有序*/
elemType deleteFirstList(struct List *L);/*13.从线性表L中删除表头元素并返回它,若删除失败则停止程序运行*/
elemType deleteLastList(struct List *L);/*14.从线性表L中删除表尾元素并返回它,若删除失败则停止程序运行*/
elemType deletePosList(struct List *L, int pos);/*15.从线性表L中删除第pos个元素并返回它,若删除失败则停止程序运行*/
int deleteValueList(struct List *L, elemType x);/*16.从线性表L中删除值为x的第一个元素,若成功返回1,失败返回0*/
void sortAlgorithm(struct List *L);/*17.排序算法*/
void againMalloc(struct List *L){/*0.扩展函数*/
elemType *p = realloc(L->list,2 * L->maxsize * sizeof(elemType));
if(!p){
printf("扩展空间分配失败!\n");
exit(1);
}
L->list = p;
L->maxsize = 2 * L->maxsize;
return ;
}
void initList(struct List *L, int ms){/*1.初始化线性表函数*/
int x=0,k=0,size;
while(ms <= 0|| ms >32767 || (ms/ms)!=1 ){
printf("线性表长度输入有误\n请输入正整数:");
scanf("%d",&ms);
}
L->list = malloc(ms *sizeof(elemType));
if(!L->list){
printf("开拓空间分配失败!\n");
exit(1);
}
L->maxsize = ms;
printf("请输入小于%d的数据长度以便录入:",L->maxsize);
scanf("%d",&size);
while(size>L->maxsize||size<0){
printf("输入数据长度有误,请重新输入1--%d的数据长度",L->maxsize);
}
L->size=size;
printf("请输入%d个数据,空格间隔:",L->size);
while(k != (L->size)){
scanf("%d",&x);
if(x>=(-32768)||x<=32767){
}
else{
printf("输入x有误,请重新输入:");
scanf("%d",&x);
k--;
continue;
}
L->list[k]=x;
k++;
}
printf("线性表L输入完毕!");
return ;
}
void clearList(struct List *L){/*2.清除线性表函数*/
if(L->list != NULL){
free(L->list);
L->list = 0;
L->size = 0;
L->maxsize = 0;
}
else{
exit(1);
}
return ;
}
int sizeList(struct List *L){/*3.返回线性表长度函数*/
return L->size;
}
int emptyList(struct List *L){/*4.判定线性表是否为空函数*/
if(L->size ==0){
return 1;
}
else{
return 0;
}
}
elemType getElem(struct List *L, int pos){/*5.返回线性表L中第pos个元素的值,若pos超出范围,则停止程序运行*/
while(pos>L->size||pos<1){
printf("查询pos位置越界\n请重新输入>1%d<=的正整数",L->size);
scanf("%d",&pos);
return getElem(L, pos);
}
return L->list[pos-1];
}
void traverseList(struct List *L){/*6.遍历输出线性表L中每个元素*/
int i;
for(i=0;i<L->size;i++){
printf("%d ",L->list[i]);
}
return ;
}
int findList(struct List *L, elemType x){/*7.查找线性表L中与x相等元素并返回其位置,否则返回提示语句*/
int i=0,j=0,l;
for(i=0;i<L->size;i++){
if(L->list[i] == x){
j++;
l=i+1;
}
}
if(j==0){
printf("该线性表没有与x相等的数据");
}
return l;
}
int updatePosList(struct List *L, int pos, elemType x){/*8.把线性表L中第pos个元素的值修改为x的值,若修改成功返回1,否则返回0*/
while(pos<1||pos>L->size){
printf("修改位置越界请重新输入[1,%d]之间的正整数:",L->size);
scanf("%d",pos);
while(x<(-32768)||x>32767){
printf("要求修改的x不是匹配的elemType类型或越界请重新输入-32768--32767 之间的整数:");
scanf("%d",x);
}
updatePosList(L,pos,x);
}
while(L->list==NULL){
int hs=0;
printf("线性表为空没有可供修改的值,需要重新构造线性表L\n");
printf("请输入新线性表的长度:");
scanf("%d",hs);
initList(L,hs);
updatePosList(L,pos,x);
}
L->list[pos-1]=x;
if(L->list[pos-1]==x){
printf("修改成功返回1");
return 1;
}
else{
printf("修改不成功返回0");
return 0;
}
}
void inserFirstList(struct List *L, elemType x){/*9.向线性表L的表头插入元素x*/
int i=1,j=0;
while(L->list==NULL){
int hs=0;
printf("线性表为空没有可供修改的值,需要重新构造线性表L\n");
printf("请输入新线性表的长度:");
scanf("%d",&hs);
initList(L,hs);
while(x<(-32768)||x>32767){
printf("要求修改的x不是匹配的elemType类型或越界请重新输入-32768--32767 之间的整数:");
scanf("%d",x);
}
inserFirstList(L,x);
}
if(L->size+1>L->maxsize){
struct List *h=0 ;
printf("原线性表已满,执行重新构造线性表");
h->list = malloc((L->maxsize+1) * sizeof(elemType));
if(!h->list){
printf("扩展空间分配失败!\n");
exit(1);
}
h->list[0]=x;
for(i = 1,j = 0;i <L->maxsize,j <(L->maxsize-1);i++,j++){
h->list[i]=L->list[j];
}
h->maxsize = L->maxsize+1;
h->size = L->maxsize+1;
clearList(L);
L->list = h->list;
clearList(h);
}
else{
printf("原线性表未满,表头插入成功!");
for(i=1,j=0;i<L->size,j<(L->size-1);i++,j++){
L->list[L->size-j]=L->list[L->size-i];
}
L->list[0]=x;
L->size=L->size+1;
}
}
void insertLastList(struct List *L, elemType x){/* 10.向线性表L的表尾插入元素x*/
int i=0,j=0;
while(L->list==NULL){
int hs=0;
printf("线性表为空没有可供修改的值,需要重新构造线性表L\n");
printf("请输入新线性表的长度:");
scanf("%d",&hs);
initList(L,hs);
while(x<(-32768)||x>32767){
printf("要求修改的x不是匹配的elemType类型或越界请重新输入-32768--32767 之间的整数:");
scanf("%d",x);
}
insertLastList(L,x);
}
if(L->size+1>L->maxsize){
struct List *h =0;
printf("原线性表已满,执行重新构造线性表");
h->list = malloc((L->maxsize+1) * sizeof(elemType));
if(!h->list){
printf("扩展空间分配失败!\n");
exit(1);
}
h->list[L->maxsize]=x;
for(i = 0,j = 0;i <L->maxsize,j <L->maxsize;i++,j++){
h->list[i]=L->list[j];
}
h->maxsize = L->maxsize+1;
h->size = L->maxsize+1;
clearList(L);
L->list = h->list;
clearList(h);
}
else{
printf("原线性表未满,执行表尾插入成功!");
L->list[L->size]=x;
L->size=L->size+1;
}
}
int insertPosList(struct List *L, int pos, elemType x){/*11.向线性表L中第pos个元素位置插入元素x,若插入成功返回1,否则返回0*/
int i=1,j=0;
while(L->list==NULL){
int hs=0;
printf("线性表为空没有可供修改的值,需要重新构造线性表L\n");
printf("请输入新线性表的长度:");
scanf("%d",&hs);
initList(L,hs);
while(x<(-32768)||x>32767){
printf("要求修改的x不是匹配的elemType类型或越界请重新输入-32768--32767 之间的整数:");
scanf("%d",&x);
}
while(pos<=1||pos>=L->size){
printf("输入插入位置错误,请重新输入>1且<%d的正整数",L->size);
scanf("%d",&pos);
}
insertPosList(L,pos,x);
}
if(L->size+1>L->maxsize){
struct List *h =0;
printf("原线性表已满,执行重新构造线性表");
h->list = malloc((L->maxsize+1) * sizeof(elemType));
if(!h->list){
printf("扩展空间分配失败!\n");
exit(1);
}
for(i = 1,j = 0;i <L->maxsize,(j <L->maxsize+1);i++,j++){
if((L->size-i)== (pos - i)){
h->list[L->size-i]=x;
}
else{
h->list[L->size-j]=L->list[L->size-i];
}
}
h->maxsize = L->maxsize+1;
h->size = L->maxsize+1;
clearList(L);
L->list = h->list;
clearList(h);
}
else{
printf("原线性表未满,可以执行表中插入");
for(i = L->size - 1; i >= pos - 1; i--){
L->list[i + 1] = L->list[i];
}
L->list[pos - 1] = x;
L->size=L->size+1;
return 1;
}
return 0;
}
void insertOrderList(struct List *L, int pos,elemType x){/*12.向有序线性表L中插入元素x, 使得插入后仍然有序*/
while(L->list==NULL){
int hs=0;
printf("线性表为空没有可供修改的值,需要重新构造线性表L\n");
printf("请输入新线性表的长度:");
scanf("%d",&hs);
initList(L,hs);
while(x<(-32768)||x>32767){
printf("要求修改的x不是匹配的elemType类型或越界请重新输入-32768--32767 之间的整数:");
scanf("%d",&x);
}
while(pos<1||pos>L->size){
printf("输入插入位置错误,请重新输入>=1且<=%d的正整数",L->size);
}
}
if(pos==1){
inserFirstList(L,x);
sortAlgorithm(L);
traverseList(L);
}
else if(pos==L->size){
insertLastList(L,x);
sortAlgorithm(L);
traverseList(L);
}
else{
insertPosList(L,pos,x);
sortAlgorithm(L);
traverseList(L);
}
return ;
}
void sortAlgorithm(struct List *L){
int j=0,k=1,i=0,l=1;
printf("请选择1->升序或者2->降序:");
scanf("%d",&i);
while(!(i==1||i==2)){
printf("选择错误,请重新选择:");
scanf("%d",&i);
}
switch(i)
{
case 1:
for(j=0;j<L->size;j++){
while(k<L->size){
if(L->list[j]>L->list[k])
{
i=L->list[j];
L->list[j]=L->list[k];
L->list[k]=i;
}
k++;
}
k=l++;
}
break;
default:
for(j=0;j<L->size;j++){
while(k<L->size){
if(L->list[j]<L->list[k])
{
i=L->list[j];
L->list[j]=L->list[k];
L->list[k]=i;
}
k++;
}
k=l++;
}
break;
}
return ;
}
elemType deleteFirstList(struct List *L){/*13.从线性表L中删除表头元素并返回它,若删除失败则停止程序运行*/
int i=0;
elemType k=0;
k=L->list[i];
for(i=0;i<L->size;i++){
L->list[i]=L->list[i+1];
}
L->list[i]=0;
L->size=L->size-1;
L->maxsize=L->maxsize-1;
return k;
}
elemType deleteLastList(struct List *L){/*14.从线性表L中删除表尾元素并返回它,若删除失败则停止程序运行*/
elemType k=0;
k=L->list[L->size-1];
L->list[L->size-1]=0;
L->size=L->size-1;
L->maxsize=L->maxsize-1;
return k;
}
elemType deletePosList(struct List *L, int pos){/*15.从线性表L中删除第pos个元素并返回它,若删除失败则停止程序运行*/
int i=0;
elemType k=0;
while(L->list==NULL){
int hs=0;
printf("线性表为空没有可供修改的值,需要重新构造线性表L\n");
printf("请输入新线性表的长度:");
scanf("%d",&hs);
initList(L,hs);
while(pos<=1||pos>=L->size){
printf("输入插入位置错误,请重新输入>1且<%d的正整数",L->size);
scanf("%d",&pos);
}
deletePosList(L,pos);
}
k=L->list[pos-1];
if(pos-i<L->size){
L->list[pos-1-i]=L->list[pos-i];
}
L->list[L->size-1]=0;
L->size=L->size-1;
L->maxsize=L->maxsize-1;
return k;
}
int deleteValueList(struct List *L, elemType x){/*16.从线性表L中删除值为x的第一个元素,若成功返回1,失败返回0*/
while(L->list==NULL){
int hs=0;
printf("线性表为空没有可供修改的值,需要重新构造线性表L\n");
printf("请输入新线性表的长度:");
scanf("%d",&hs);
initList(L,hs);
while(x<(-32768)||x>32767){
printf("要求修改的x不是匹配的elemType类型或越界请重新输入-32768--32767 之间的整数:");
scanf("%d",x);
}
deleteValueList(L,x);
}
if(findList(L,x)==1){
deleteFirstList(L);
}
else if(findList(L,x)==L->size){
deleteLastList(L);
}
else{
deletePosList(L,findList(L,x));
}
return 1;
}
void main()
{
int i,ms,pos;
elemType x;
struct List L;
while(1){
printf("0->扩展线性表为2倍\n1->初始化线性表\n2->清除线性表\n3->返回线性表长度\n4->判定线性表是否为空\n5->返回线性表L中第pos个元素的值\n");
printf("6->遍历输出线性表L中每个元素\n7->查找线性表L中与x相等元素并返回其位置\n8->把线性表L中第pos个元素的值修改为x的值\n");
printf("9->向线性表L的表头插入元素x\n10->向线性表L的表尾插入元素x\n11->向线性表L中第pos个元素位置插入元素x\n");
printf("12->向有序线性表L中插入元素x使得插入后仍然有序\n13->从线性表L中删除表头元素并返回它\n14->从线性表L中删除表尾元素并返回它\n");
printf("15->从线性表L中删除第pos个元素并返回它\n16->从线性表L中删除值为x的第一个元素\n17->排序算法\n");
printf("请选择操作:");
scanf("%d",&i);
while(i<0||i>17){
printf("输入操作不存在,重新输入");
scanf("%d",&i);
continue;
}
switch(i){
case 0:
printf("\n");
printf("0->扩展线性表为2倍");
againMalloc(&L);
break;
case 1:
printf("\n");
printf("1->初始化线性表");
printf("请输入构造线性表长度:");
scanf("%d",&ms);
initList(&L,ms);
break;
case 2:
printf("\n");
printf("2->清除线性表");
clearList(&L);
break;
case 3:
printf("\n");
printf("3->返回线性表长度");
printf("线性表长度为%d",sizeList(&L));
getchar();
getchar();
break;
case 4:
printf("\n");
printf("4->判定线性表是否为空:");
if(!emptyList(&L)){
printf("线性表非空!");
}
else{
printf("线性表为空!");
}
getchar();
getchar();
break;
case 5:
printf("\n");
printf("5->返回线性表L中第pos个元素的值\n");
printf("请输入查询L线性表pos位置:");
scanf("%d",&pos);
printf("\n");
printf("线性表第%d个值为%d",pos,getElem(&L,pos));
getchar();
getchar();
break;
case 6:
printf("\n");
printf("6->遍历输出线性表L中每个元素");
traverseList(&L);
getchar();
getchar();
break;
case 7:
printf("\n");
printf("7->查找线性表L中与x相等元素并返回其位置\n");
printf("请输入查询x的值:");
scanf("%d",&x);
printf("\n");
printf("与x相等的表中位置为:%d",findList(&L,x));
getchar();
getchar();
break;
case 8:
printf("\n");
printf("8->把线性表L中第pos个元素的值修改为x的值\n");
printf("请输入把线性表L位于pos值改为x:\n");
printf("请输入pos:");
scanf("%d",&pos);
printf("\n");
printf("请输入x:");
scanf("%d",&x);
updatePosList(&L,pos,x);
break;
case 9:
printf("\n");
printf("9->向线性表L的表头插入元素x\n");
printf("请输入在表头插入的x值\n");
scanf("%d",&x);
inserFirstList(&L,x);
getchar();
getchar();
break;
case 10:
printf("\n");
printf("10->向线性表L的表尾插入元素x\n");
printf("请输入在表尾插入的x值:");
scanf("%d",&x);
insertLastList(&L,x);
getchar();
getchar();
break;
case 11:
printf("\n");
printf("11->向线性表L中第pos个元素位置插入元素x\n");
printf("请输入在表L中pos位置插入的x值\n");
printf("请输入pos:");
scanf("%d",&pos);
printf("\n");
printf("请输入x:");
scanf("%d",&x);
insertPosList(&L,pos,x);
getchar();
getchar();
break;
case 12:
printf("\n");
printf("12->向有序线性表L中插入元素x\n");
printf("请输入在表L中pos位置插入的x值\n");
printf("请输入pos:");
scanf("%d",&pos);
printf("\n");
printf("请输入x:");
scanf("%d",&x);
insertOrderList(&L,pos,x);
getchar();
getchar();
break;
case 13:
printf("\n");
printf("13->从线性表L中删除表头元素并返回它\n");
printf("被删除的表头元素为:%d",deleteFirstList(&L));
getchar();
getchar();
break;
case 14:
printf("\n");
printf("14->从线性表L中删除表尾元素并返回它");
printf("被删除的表尾元素为:%d",deleteLastList(&L));
getchar();
getchar();
break;
case 15:
printf("\n");
printf("15->从线性表L中删除第pos个元素并返回它\n");
printf("请输入在表L中删除的pos位置:");
printf("请输入pos:");
scanf("%d",&pos);
deletePosList(&L,pos);
printf("\n");
printf("被删除的表中第%d个元素为:%d",pos,deletePosList(&L,pos));
getchar();
getchar();
break;
case 16:
printf("\n");
printf("16->从线性表L中删除值为x的第一个元素\n");
printf("请输入在表L中删除的x值:");
printf("请输入x:");
scanf("%d",&x);
deleteValueList(&L,x);
getchar();
getchar();
break;
case 17:
printf("\n");
printf("17->排序算法\n");
sortAlgorithm(&L);
printf("排序后遍历:");
traverseList(&L);
getchar();
getchar();
break;
}
system("cls");
}
}