231 lines
4.5 KiB
C
231 lines
4.5 KiB
C
|
#include<stdio.h>
|
|||
|
#include<stdlib.h>
|
|||
|
#include<conio.h>
|
|||
|
#define MAX 100
|
|||
|
typedef int DataType;
|
|||
|
typedef struct {
|
|||
|
DataType data[MAX];
|
|||
|
int length;
|
|||
|
}SqList;
|
|||
|
|
|||
|
void initList(SqList *L){
|
|||
|
L->length = 0;
|
|||
|
printf("\n初始化成功\n");
|
|||
|
}
|
|||
|
int insertList(SqList *L, int i, DataType e){
|
|||
|
if(i<1 || i>(L->length+1)){
|
|||
|
return 0;
|
|||
|
}
|
|||
|
// 将 i 及其以后的元素向后移动 1 个单位
|
|||
|
for(int j=L->length;j<i-1;j--){
|
|||
|
L->data[j] = L->data[j-1];
|
|||
|
}
|
|||
|
// 插入
|
|||
|
L->data[i-1]=e;
|
|||
|
L->length++;
|
|||
|
return 1;
|
|||
|
}
|
|||
|
int DeleteList1(SqList *L, DataType e){
|
|||
|
for(int i=0;i<L->length;i++){
|
|||
|
if(L->data[i]==e){
|
|||
|
// 将 i 以后的元素向前移动 1 个单位
|
|||
|
for(int j=i;j<L->length;j++){
|
|||
|
L->data[j]=L->data[j+1];
|
|||
|
}
|
|||
|
L->length--;
|
|||
|
return 1;
|
|||
|
}
|
|||
|
}
|
|||
|
return 0;
|
|||
|
}
|
|||
|
int DeleteList2(SqList *L, int i){
|
|||
|
if(i<1 || i>(L->length)){
|
|||
|
return 0;
|
|||
|
}
|
|||
|
// 将 i-1 以后的元素向前移动 1 个单位
|
|||
|
for(int j=i-1;j<L->length;j++){
|
|||
|
L->data[j]=L->data[j+1];
|
|||
|
}
|
|||
|
L->length--;
|
|||
|
return 1;
|
|||
|
}
|
|||
|
int FindList(SqList *L, DataType e){
|
|||
|
int i=0;
|
|||
|
while(i<L->length && L->data[i]!=e){
|
|||
|
i++;
|
|||
|
}
|
|||
|
// 未找到
|
|||
|
if(i>=L->length){
|
|||
|
return -1;
|
|||
|
}
|
|||
|
return i+1;
|
|||
|
}
|
|||
|
void OutputList(SqList *L){
|
|||
|
printf("\n\n");
|
|||
|
for(int i=0;i<L->length;i++){
|
|||
|
printf("第 %d 个元素的值为:%d\n",i+1,L->data[i]);
|
|||
|
}
|
|||
|
printf("\n\n");
|
|||
|
}
|
|||
|
int DeleteList3(SqList *L, DataType start, DataType end){
|
|||
|
// 确认 start <= end
|
|||
|
int temp;
|
|||
|
if(start>end){
|
|||
|
temp=end;
|
|||
|
end=start;
|
|||
|
start=temp;
|
|||
|
}
|
|||
|
int l_s=-1,l_e=-1;
|
|||
|
for(int i=0;i<L->length;i++){
|
|||
|
// 查找区间小的位置
|
|||
|
if(L->data[i] >= start && l_s==-1){
|
|||
|
l_s=i;
|
|||
|
}
|
|||
|
// 查找区间大的位置
|
|||
|
if(L->data[i] <= end){
|
|||
|
l_e=i;
|
|||
|
}
|
|||
|
}
|
|||
|
// 未找到
|
|||
|
if(l_s==-1 || l_e==-1){
|
|||
|
return 0;
|
|||
|
}
|
|||
|
// 将 l_e + 1 以后的元素向前移动 l_e - l_s + 1 个单位
|
|||
|
int move = l_e - l_s + 1;
|
|||
|
for(int i=l_e + 1;i<L->length;i++){
|
|||
|
L->data[i-move] = L->data[i];
|
|||
|
}
|
|||
|
L->length -= move;
|
|||
|
return 1;
|
|||
|
}
|
|||
|
SqList Merge(SqList L1, SqList L2){
|
|||
|
SqList L3;
|
|||
|
int x=0,y=0,n=0;
|
|||
|
initList(&L3);
|
|||
|
while(x<L1.length && y<L2.length){
|
|||
|
if(L1.data[x]<L2.data[y]){
|
|||
|
L3.data[n]=L1.data[x];
|
|||
|
n++;
|
|||
|
x++;
|
|||
|
} else if (L1.data[x]>L2.data[y]){
|
|||
|
L3.data[n]=L2.data[y];
|
|||
|
n++;
|
|||
|
y++;
|
|||
|
} else if (L1.data[x]==L2.data[y]){
|
|||
|
L3.data[n]=L1.data[x];
|
|||
|
n++;
|
|||
|
x++;
|
|||
|
y++;
|
|||
|
}
|
|||
|
}
|
|||
|
// 插入剩余元素
|
|||
|
for(int i=x;i<L1.length;i++){
|
|||
|
L3.data[n]=L1.data[x];
|
|||
|
n++;
|
|||
|
x++;
|
|||
|
}
|
|||
|
for(int i=y;i<L2.length;i++){
|
|||
|
L3.data[n]=L2.data[y];
|
|||
|
n++;
|
|||
|
y++;
|
|||
|
}
|
|||
|
L3.length=n;
|
|||
|
return L3;
|
|||
|
}
|
|||
|
int main(){
|
|||
|
SqList L1,L2,L3;
|
|||
|
int n,choice,x,y;
|
|||
|
DataType e;
|
|||
|
initList(&L1);
|
|||
|
|
|||
|
for(;;){
|
|||
|
printf("\t\t1.输入线性表\n");
|
|||
|
printf("\t\t2.查找元素\n");
|
|||
|
printf("\t\t3.删除指定值的元素\n");
|
|||
|
printf("\t\t4.删除指定位置的元素\n");
|
|||
|
printf("\t\t5.删除位于区间的元素\n");
|
|||
|
printf("\t\t6.合并另一个线性表\n");
|
|||
|
printf("\t\t0.退出\n");
|
|||
|
|
|||
|
printf("请选择:");
|
|||
|
scanf("%d",&choice);
|
|||
|
if(choice==0) break;
|
|||
|
switch (choice) {
|
|||
|
case 1:
|
|||
|
printf("请输入线性表长度:");
|
|||
|
scanf("%d",&n);
|
|||
|
initList(&L1);
|
|||
|
for(int i=0;i<n;i++){
|
|||
|
printf("请输入第 %d 个元素:",i+1);
|
|||
|
scanf("%d",&e);
|
|||
|
insertList(&L1,i+1,e);
|
|||
|
}
|
|||
|
OutputList(&L1);
|
|||
|
break;
|
|||
|
case 2:
|
|||
|
printf("请输入需要查找的元素:");
|
|||
|
scanf("%d",&e);
|
|||
|
n=FindList(&L1,e);
|
|||
|
if(n>-1){
|
|||
|
printf("该元素在 %d\n",n);
|
|||
|
} else {
|
|||
|
printf("未找到该元素\n");
|
|||
|
}
|
|||
|
break;
|
|||
|
case 3:
|
|||
|
printf("请输入需要删除的元素的值:");
|
|||
|
scanf("%d",&e);
|
|||
|
n=DeleteList1(&L1,e);
|
|||
|
if(n==0){
|
|||
|
printf("删除失败,元素不存在。\n");
|
|||
|
} else {
|
|||
|
printf("删除成功\n");
|
|||
|
}
|
|||
|
OutputList(&L1);
|
|||
|
break;
|
|||
|
case 4:
|
|||
|
printf("请输入需要删除的元素的位置:");
|
|||
|
scanf("%d",&n);
|
|||
|
n=DeleteList2(&L1,n);
|
|||
|
if(n==0){
|
|||
|
printf("删除失败,位置不存在。\n");
|
|||
|
} else {
|
|||
|
printf("删除成功\n");
|
|||
|
}
|
|||
|
OutputList(&L1);
|
|||
|
break;
|
|||
|
case 5:
|
|||
|
printf("请输入需要删除的元素值区间 x y:");
|
|||
|
scanf("%d %d",&x,&y);
|
|||
|
n=DeleteList3(&L1,x,y);
|
|||
|
if(n==0){
|
|||
|
printf("删除失败,位置不存在。\n");
|
|||
|
} else {
|
|||
|
printf("删除成功\n");
|
|||
|
}
|
|||
|
OutputList(&L1);
|
|||
|
break;
|
|||
|
case 6:
|
|||
|
printf("请输入第二个线性表的长度:");
|
|||
|
scanf("%d",&n);
|
|||
|
initList(&L2);
|
|||
|
for(int i=0;i<n;i++){
|
|||
|
printf("请输入第 %d 个元素:",i+1);
|
|||
|
scanf("%d",&e);
|
|||
|
insertList(&L2,i+1,e);
|
|||
|
}
|
|||
|
OutputList(&L2);
|
|||
|
L3=Merge(L1,L2);
|
|||
|
printf("合并后线性表:");
|
|||
|
OutputList(&L3);
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
printf("请按任意键继续...");
|
|||
|
getch();
|
|||
|
system("cls");
|
|||
|
}
|
|||
|
printf("感谢使用,再见\n");
|
|||
|
return 0;
|
|||
|
}
|