編寫一個完整的程序,實現順序表的建立、插入、刪除、輸出等基本運算。
(1) 建立一個順序表,含有n個數據元素。
(2) 輸出順序表及順序表的長度。
(3) 在順序表中刪除值為x的結點或者刪除給定位置i的結點。
(4) 將順序表就地逆置,即利用原表的存儲空間將線性表(a1,a2,...,an)逆置為(an,an-1,...,a1)。
(5) 將順序表按升序排序。
(6) 設順序表中的數據元素遞增有序,將x插入到順序表的適當位置上,以保持該表的有序性。
(7) 將兩個順序有序表A和B合並為一個有序表C。
在主函數中設計一個簡單的菜單,分別測試上述算法
[cpp] //因為之前沒有寫過這樣的操作菜單,所以很多地方沒做好。比如說輸入輸出的數據沒有對齊,整個排版看起來有些擁擠,每一次操作都會輸出一次菜單。
//實驗目的是測試各個函數的作用,寫的時候除了創建順序表的函數,其他函數後面我都加了一個輸出函數,將按要求改變後的順序表直接輸出了。
//我將a、b、c數組和n、m都設置成了全局變量,方便代碼的操作。
//因為創建函數沒有設置形參,在合並數組的時候,我是先將a數組賦值給b數組,數組合並後將c數組再復制給a數組輸出。這個是我事先沒考慮到,下次改進。
//輸出菜單可以放在函數裡面,主函數中的代碼看起來會簡潔很多,之前也沒想到。
//寫完之後發現把刪除數據的函數給漏掉了,後面又加上了。
//測試數據:a數組:5 2 5 3 4 1
//插入元素:第3位 7
//b數組:7 8 9 10 11 12 13 14
//刪除數據: 第3位
#include<stdio.h>
#define N 105
int a[N],b[N],c[N*2];
int n,m;
void Creatlist()//創建函數
{
int i;
printf("輸入數據數量: ");
scanf("%d",&n);
printf("輸入數據: ");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
return ;
}
void Printlist()//打印函數
{
int i;
printf("順序表長度n: %d\n",n);
printf("順序表: ");
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
return ;
}
void Inverlist()//逆序函數,逆序後直接輸出
{
int r,l;
int temp;
for(l=0,r=n-1;l<=r;l++,r--)
{
temp=a[r];
a[r]=a[l];
a[l]=temp;
}
Printlist();
return ;
}
void Sortlist()//排序函數,用的是冒泡排序,因為不是實驗重點,也就沒太注意效率的問題。
{
int i,j;
int temp;
for(i=n-1;i>=1;i--)
{
for(j=0;j<i;j++)
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
Printlist();
return ;
}
void Insertlist()//插入函數
{
int x,y;
int temp0,temp1;
int i;
printf("插入數據的位置: ");
scanf("%d",&x);
printf("插入數據的數值: ");
scanf("%d",&y);
temp0=a[x-1];
a[x-1]=y;
for(i=x;i<n;i++)
{
temp1=a[i];
a[i]=temp0;
temp0=temp1;
}
a[i]=temp0;
n++;
Printlist();
return ;
}
void Comlist()//合並函數,在這個函數中重新輸入了一個數組
{
int i,j,k;
for(i=0;i<n;i++)
b[i]=a[i];
m=n;
Creatlist();
i=j=k=0;
while(i<n||j<m)
{
if(a[i]<b[j]&&i<n&&j<m)
{
c[k++]=a[i];
i++;
}
else if(a[i]>=b[j]&&i<n&&j<m)
{
c[k++]=b[j];
j++;
}
else if(i==n)
{
c[k++]=b[j];
j++;
}
else
{
c[k++]=a[i];
i++;
}
}
for(i=0;i<k;i++)
a[i]=c[i];
n=k;
Printlist();
return ;
}
void Delelist()
{
int x;
int i;
printf("需要刪除的數據的位置: ");
scanf("%d",&x);
a[x-1]=a[x];
for(i=x;i<n-1;i++)
a[i]=a[i+1];
n--;
Printlist();
return ;
}
int main()
{
int T;
int flag;
flag=1;
while(1)//永真循環,在輸入0是跳出
{
printf("*********目錄*********\n");
printf("創建一個順序表: 1\n");
printf("輸出順序表及其長度: 2\n");
printf("將順序表逆置: 3\n");
printf("將順序表升序排序: 4\n");
printf("將一個值插入順序表: 5\n");
printf("將兩個有序表合並輸出:6\n");
printf("刪除表中的某個元素: 7\n");
printf("結束操作: 0\n");
printf("請輸入操作代碼: ");
scanf("%d",&T);
switch(T)
{
case 1:Creatlist();break;
case 2:Printlist();break;
case 3:Inverlist();break;
case 4:Sortlist();break;
case 5:Insertlist();break;
case 6:Comlist();break;
case 7:Delelist();break;
case 0:flag=0;break;
default:printf("輸入錯誤,請重新輸入!\n");break;//輸入數據不合法
}
printf("\n");
if(!flag)
break;
}
printf("謝謝使用!\n");
return 0;
}
//因為之前沒有寫過這樣的操作菜單,所以很多地方沒做好。比如說輸入輸出的數據沒有對齊,整個排版看起來有些擁擠,每一次操作都會輸出一次菜單。
//實驗目的是測試各個函數的作用,寫的時候除了創建順序表的函數,其他函數後面我都加了一個輸出函數,將按要求改變後的順序表直接輸出了。
//我將a、b、c數組和n、m都設置成了全局變量,方便代碼的操作。
//因為創建函數沒有設置形參,在合並數組的時候,我是先將a數組賦值給b數組,數組合並後將c數組再復制給a數組輸出。這個是我事先沒考慮到,下次改進。
//輸出菜單可以放在函數裡面,主函數中的代碼看起來會簡潔很多,之前也沒想到。
//寫完之後發現把刪除數據的函數給漏掉了,後面又加上了。
//測試數據:a數組:5 2 5 3 4 1
//插入元素:第3位 7
//b數組:7 8 9 10 11 12 13 14
//刪除數據: 第3位
#include<stdio.h>
#define N 105
int a[N],b[N],c[N*2];
int n,m;
void Creatlist()//創建函數
{
int i;
printf("輸入數據數量: ");
scanf("%d",&n);
printf("輸入數據: ");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
return ;
}
void Printlist()//打印函數
{
int i;
printf("順序表長度n: %d\n",n);
printf("順序表: ");
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
return ;
}
void Inverlist()//逆序函數,逆序後直接輸出
{
int r,l;
int temp;
for(l=0,r=n-1;l<=r;l++,r--)
{
temp=a[r];
a[r]=a[l];
a[l]=temp;
}
Printlist();
return ;
}
void Sortlist()//排序函數,用的是冒泡排序,因為不是實驗重點,也就沒太注意效率的問題。
{
int i,j;
int temp;
for(i=n-1;i>=1;i--)
{
for(j=0;j<i;j++)
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
Printlist();
return ;
}
void Insertlist()//插入函數
{
int x,y;
int temp0,temp1;
int i;
printf("插入數據的位置: ");
scanf("%d",&x);
printf("插入數據的數值: ");
scanf("%d",&y);
temp0=a[x-1];
a[x-1]=y;
for(i=x;i<n;i++)
{
temp1=a[i];
a[i]=temp0;
temp0=temp1;
}
a[i]=temp0;
n++;
Printlist();
return ;
}
void Comlist()//合並函數,在這個函數中重新輸入了一個數組
{
int i,j,k;
for(i=0;i<n;i++)
b[i]=a[i];
m=n;
Creatlist();
i=j=k=0;
while(i<n||j<m)
{
if(a[i]<b[j]&&i<n&&j<m)
{
c[k++]=a[i];
i++;
}
else if(a[i]>=b[j]&&i<n&&j<m)
{
c[k++]=b[j];
j++;
}
else if(i==n)
{
c[k++]=b[j];
j++;
}
else
{
c[k++]=a[i];
i++;
}
}
for(i=0;i<k;i++)
a[i]=c[i];
n=k;
Printlist();
return ;
}
void Delelist()
{
int x;
int i;
printf("需要刪除的數據的位置: ");
scanf("%d",&x);
a[x-1]=a[x];
for(i=x;i<n-1;i++)
a[i]=a[i+1];
n--;
Printlist();
return ;
}
int main()
{
int T;
int flag;
flag=1;
while(1)//永真循環,在輸入0是跳出
{
printf("*********目錄*********\n");
printf("創建一個順序表: 1\n");
printf("輸出順序表及其長度: 2\n");
printf("將順序表逆置: 3\n");
printf("將順序表升序排序: 4\n");
printf("將一個值插入順序表: 5\n");
printf("將兩個有序表合並輸出:6\n");
printf("刪除表中的某個元素: 7\n");
printf("結束操作: 0\n");
printf("請輸入操作代碼: ");
scanf("%d",&T);
switch(T)
{
case 1:Creatlist();break;
case 2:Printlist();break;
case 3:Inverlist();break;
case 4:Sortlist();break;
case 5:Insertlist();break;
case 6:Comlist();break;
case 7:Delelist();break;
case 0:flag=0;break;
default:printf("輸入錯誤,請重新輸入!\n");break;//輸入數據不合法
}
printf("\n");
if(!flag)
break;
}
printf("謝謝使用!\n");
return 0;
}