導讀:今晚先上傳所有的源代碼,日後進行詳細解讀
//2018/1/14 22:11
//順序表(借用一個一維數組來表示,靜態順序表)
#include<stdio.h>
#define Maxsize 100
typedef struct
{
int data[Maxsize];
int length;
}Seqlist;
Seqlist * creat(Seqlist * L); //創建順序表,第一種寫法
void printfdata(Seqlist * L); //打印順序表
Seqlist *initseq(Seqlist *L); //初始化順序表
Seqlist *delet_number(Seqlist *L); //刪除順序表第i個元素
Seqlist *delet_data(Seqlist *L); //刪除順序表所有值爲x的元素
Seqlist *delet_datast(Seqlist *L,int s,int t);//刪除順序表值爲是s和t之間的元素
Seqlist *insert_number(Seqlist *L); //插入順序表第i個元素
Seqlist *reverse1(Seqlist *L); //逆置順序表1
Seqlist *reverse2(Seqlist *L); //逆置順序表1
Seqlist *bubble(Seqlist *L); //冒泡排序
Seqlist *bubble1(Seqlist *L); //冒泡排序優化
Seqlist *zheban_insertsort(Seqlist *L); //折半插入排序
Seqlist *zheban_insertsort1(Seqlist *L); //折半插入排序優化
Seqlist *zhijie_insertsort(Seqlist *L); //直接插入排序
Seqlist *zhijie_insertsort1(Seqlist *L); //直接插入排序優化
Seqlist *quik_sort(Seqlist *L,int left,int right);//快速排序
Seqlist *Select_sort(Seqlist *L); //選擇排序
Seqlist *merge_sort(Seqlist *L,int low,int high);//歸併排序
Seqlist *merge_sort_zi(Seqlist *L,int low,int mid,int high);
Seqlist *shell_sort(Seqlist *L); //希爾排序
//Seqlist *bubble(Seqlist *L);//冒泡排序順序表
Seqlist creat2(Seqlist * L);//第二種寫法
//void printfdata2(Seqlist L);
Seqlist initseq2(Seqlist *L);
int main()
{
printf("--------------------------------------------------------------------------------\n");
printf(" *順序表的實現及相關操作* \n");
printf("\n");
printf(" 0.順序表的初始化 \n");
printf(" 1.刪除第i個元素 \n");
printf(" 2.刪除所有元素爲x的元素 \n");
printf(" 3.刪除其值在s與t之間的所有元素 \n");
printf(" 4.插入第i個位置 \n");
printf(" 5.排序(從小到大) \n");
printf(" 6.逆置 \n");
printf(" 7.創建順序表 \n");
printf(" 8.打印順序表 \n");
printf(" 9.退出 \n");
//測試
//int ff;
//scanf("%d",&ff);
//printf("%d",ff);
Seqlist L,L2;
int number,number0;
printf("請輸入功能序號: ");
scanf("%d",&number);
while(number>=0 && number<=9)
{
switch(number)
{
case 0:
printf("-----初始化開始啦\n");
printf("\n");
initseq(&L);
printf("-----初始化結束啦\n");
printf("\n");
break;
case 1:
printf("\n");
delet_number(&L);//刪除第i個元素
printf("\n");
break;
case 2:
printf("\n");
delet_data(&L);//刪除所有元素爲x的元素
printf("\n");
break;
case 3:
printf("\n");
int s,t;
printf("請輸入下限值s:");
scanf("%d",&s);
printf("請輸入上限值t:");
scanf("%d",&t);
delet_datast(&L,s,t);//刪除其值在s與t之間的所有元素
printf("\n");
break;
case 4:
printf("\n");
insert_number(&L);//插入第i個位置
printf("\n");
break;
case 5:
printf("\n");
//bubble(&L);
//bubble1(&L);
//zhijie_insertsort1(&L);
//zheban_insertsort(&L);
//zheban_insertsort1(&L);
//shell_sort(&L);
//Select_sort(&L); //選擇排序
quik_sort(&L,1,L.length);
printf("\n");
break;
case 6:
printf("\n");
printf("6");
reverse1(&L);//逆置
printf("\n");
break;
case 7:
printf("\n");
printf("-----創建順序表開始啦\n");//
creat(&L);
//printfdata(&L);
printf("-----創建順序表結束啦\n");//
printf("\n");
break;
case 8:
printf("\n");
printf("-----打印順序表開始啦\n");//
printfdata(&L);
printf("-----打印順序表結束啦\n");//
printf("\n");
break;
case 9:
default:
break;
}
printf("\n");
printf("請輸入功能序號:");
scanf("%d",&number0);
number = number0;
printf("\n");
}
/*Seqlist L,L2;//第一種寫法
initseq(&L);
initseq2(&L2);
// creat(&L);
// creat2(&L2);
// printf("%d\n",L2.data[4]);
printfdata(&L);
// printfdata(L2);*/
return 0;
}
Seqlist *initseq(Seqlist *L)
{
//鏈表初始化1
int i;
L->length = 0;
for(i=1;i<=Maxsize;i++)
L->data[i] = 0;
return L;
}
Seqlist initseq2(Seqlist *L)
{
//順序表初始化
int i;
L->length = 0;
for(i=1;i<=Maxsize;i++)
L->data[i] = 0;
return *L;
}
Seqlist * creat(Seqlist *L)
{//創建順序表
int n,data0,i;
printf("請輸入順序表的元素個數: ");
scanf("%d",&n);
for (i=1;i<=n;i++)
{
printf("請輸入第%d個順序表的元素值:",i);
scanf("%d",&L->data[i]);
//L->data[i] = data0;
}
L->length = n;
return L;
}
Seqlist creat2(Seqlist *L)
{//創建順序表
int n,data0,i;
printf("請輸入順序表的元素個數: ");
scanf("%d",&n);
for (i=1;i<=n;i++)
{
printf("請輸入第%d個順序表的元素值:",i);
scanf("%d",&L->data[i]);
//L->data[i] = data0;
}
L->length = n;
return * L;
}
void printfdata(Seqlist * L)
{//打印順序表
//printf("開始打印數據了\n");
int i;
for (i = 1;i<=L->length;i++)
printf("%d ",L->data[i]);
printf("\n");
}
Seqlist *delet_number(Seqlist *L)
{//刪除順序表第i個元素
int number;
printf("開始刪除了\n");
printf("請輸入要刪除的元素序號:");
scanf("%d",&number);
int i,temp;
for(i = number;i<=L->length+1;i++)
{
L->data[number] = L->data[number+1];
number++;
}
L->length--;
return L;
printf("刪除結束了\n");
}
Seqlist *delet_data(Seqlist *L)
{//刪除順序表所有值爲x的元素
int data,i,j;
printf("請輸入所要刪除的元素值:");
scanf("%d",&data);
for(i=L->length;i>=1;i--)
{
if(L->data[i]==data)
{
for(j=i;j<=L->length;j++)
{
L->data[i] = L->data[i+1];
i++;
}
L->length--;
}
}
return L;
}
Seqlist *delet_datast(Seqlist *L,int s,int t)
{//刪除順序表值爲是s和t之間的元素
int i,j;
for(i=L->length;i>=1;i--)
{
if(L->data[i]>s && L->data[i]<t)
{
for(j=i;j<=L->length;j++)
{
L->data[i] = L->data[i+1];
i++;
}
L->length--;
}
}
return L;
}
Seqlist *insert_number(Seqlist *L)
{//插入順序表第i個元素
int number,i,l = L->length,data;
printf("請輸入要插入的位置序號:");
scanf("%d",&number);
printf("請輸入要插入的元素值:");
scanf("%d",&data);
for(i=l;i>=number;i--)
{
L->data[i+1] = L->data[i];
l--;
}
L->data[number] = data;
L->length++;
return L;
}
Seqlist *reverse1(Seqlist *L)
{//逆置順序表1
int l = L->length,i,temp;
for (i=1;i<=l/2;i++)
{
temp = L->data[i];
L->data[i] = L->data[L->length-i+1];
L->data[L->length-i+1] = temp;
}
return L;
}
Seqlist *bubble(Seqlist *L)
{//冒泡排序順序表(複雜寫法)
int temp,i,j;
for (i=1;i<=L->length;i++)
{
for(j=1;j<L->length;j++)
if(L->data[j]>L->data[j+1])
{
temp = L->data[j];
L->data[j] = L->data[j+1];
L->data[j+1] = temp;
}
}
return L;
}
Seqlist *bubble1(Seqlist *L)
{//冒泡排序順序表(優化版本)
int temp,i,j;
for (i=1;i<=L->length;i++)
{
for(j=1;j<=L->length-i;j++)
if(L->data[j]>L->data[j+1])
{
temp = L->data[j];
L->data[j] = L->data[j+1];
L->data[j+1] = temp;
}
}
return L;
}
Seqlist *zhijie_insertsort(Seqlist *L)
{ //直接插入排序順序表
int i,j;
for (i=1;i<L->length;i++)
{
if(L->data[i+1]<L->data[i])
{
int temp = L->data[i+1];
for(j=i;j>0&&L->data[j]>temp;j--)
L->data[j+1] = L->data[j];
L->data[j+1] = temp;
}
}
return L;
}
Seqlist *zhijie_insertsort1(Seqlist *L)
{ //直接插入排序順序表(優化版)
int i,j;
for (i=2;i<=L->length;i++)
{
L->data[0] = L->data[i];
j = i-1;
while(L->data[0]<L->data[j])
{
L->data[j+1] = L->data[j];
j--;
}
L->data[j+1] = L->data[0];
}
return L;
}
Seqlist *zheban_insertsort(Seqlist *L)
{ //折半插入排序
int i,j,low,high,mid;
for(i=2;i<=L->length;i++) //逐步擴大有序表
{
L->data[0] = L->data[i];
low = 1;high = i-1;
while(low<=high) //利用折半查找尋找插入位置
{
mid = (low+high)/2;
if(L->data[0]<L->data[mid])
high = mid-1;
else
low = mid+1;
}
for(j=i-1;j>=low;j--)//for(j=i-1;j>=high+1;j--)//成塊移動
{
L->data[j+1] = L->data[j];
}
L->data[high+1] = L->data[0];
}
return L;
}
Seqlist *zheban_insertsort1(Seqlist *L)
{ //折半插入排序(優化)
int i,j,low,high,mid;
for(i=2;i<=L->length;i++) //逐步擴大有序表
{
if(L->data[i-1]>L->data[i]) //加了一個if做判斷,是發生逆序才插入,否則就跳過
{
L->data[0] = L->data[i];
low = 1;high = i-1;
while(low<=high) //利用折半查找尋找插入位置
{
mid = (low+high)/2;
if(L->data[0]<L->data[mid])
high = mid-1;
else
low = mid+1;
}
for(j=i-1;j>=low;j--)//for(j=i-1;j>=high+1;j--)//成塊移動,後一種寫法也可以,可以想想爲什麼
{
L->data[j+1] = L->data[j];
}
L->data[high+1] = L->data[0];
}
}
return L;
}
Seqlist *shell_sort(Seqlist *L)
{ //希爾排序
int gap = 4,start=1,i,j;
while(gap>=1)
{
for(i=start+gap;i<=L->length;i++)
{
if(L->data[i-gap]>L->data[i])//
{
L->data[0] = L->data[i];
j=i;
for(j=i;j>=1&&L->data[j-gap]>L->data[0];j=j-gap)
{
L->data[j] = L->data[j-gap];
}
L->data[j] = L->data[0];
}
}
gap = gap/2;
}
return L;
}
Seqlist *Select_sort(Seqlist *L)
{ //選擇排序
int i,j,min=L->data[1],jj,k;
for(i=1;i<=L->length;i++)
{
min = L->data[i];
for (j=i+1;j<=L->length;j++)
{
if(min>L->data[j])
min = L->data[j];
}
for (jj=i;jj<=L->length;jj++)
{
if(L->data[jj] == min )
{
k = jj;
break;
}
}
L->data[k] = L->data[i];
L->data[i] = min;
}
return L;
}
Seqlist *quik_sort(Seqlist *L,int left,int right)
{ //*****快速排序(遞歸)
int i,j;
if(left<right)
{
int key = L->data[left];
int low = left;
int high = right;
while(low<high)
{
while(low<high&&L->data[high]>key)
{
high--;
}
L->data[low] = L->data[high];
while(low<high&&L->data[low]<key)
{
low++;
}
L->data[high] = L->data[low];
}
L->data[low] = key;
quik_sort(L,left,low-1);//知道爲什麼是L,而不是&L嗎?
quik_sort(L,low+1,right);//
}
return L;
}
Seqlist *merge_sort(Seqlist *L,int low,int high)
{//歸併排序
if(low<high)
{
int mid = (low+high)/2;
merge_sort(L,low,mid);
merge_sort(L,mid+1,high);
merge_sort_zi(L,low,mid,high);
}
return L;
}
Seqlist *merge_sort_zi(Seqlist *L,int low,int mid,int high)
{//歸併(兩個有序表的合併)
Seqlist *M;
M = L;
int i,j,k;
//printfdata(M);
for(i=low,j=high,k=i;i<=mid&&j<=high;k++)
{
if(M->data[i]<L->data[j])
L->data[k] = M->data[i++];
else
L->data[k] = M->data[j++];
while(i<=mid)
L->data[k++] = M->data[i++];
while(j<=high)
L->data[k++] = M->data[j++];
}
return L;
}