排序使用簡單的插入排序實現:
C代碼
void one_sort(int *sqList,int val,int len)
{
int pos=len;
int temp=val;
while(val<sqList[pos-1]&&pos>0)
{
sqList[pos]=sqList[pos-1];
pos--;
}
sqList[pos]=temp;
}
//直接插入排序實現
void straisort(struct Arr * pArr)
{
for(int i=1;i<pArr->cnt;i++)
{
one_sort(pArr->pBase,pArr->pBase[i],i);//調用單步排序
}
}
直接插入排序通用算法:
C代碼
void one_sort(int *sqList,int val,int len)
{
int pos=len;
int temp=val;
while(val<sqList[pos-1]&&pos>0)
{
sqList[pos]=sqList[pos-1];
pos--;
}
sqList[pos]=temp;
}
//直接插入排序實現
void straisort(int *arr,int len)
{
int i;
for(i=1;i<len;i++)
{
one_sort(arr,arr[i],i);//調用直接插入排序
}
}
線性表的操作數組實現代碼如下,當然功能並不全面,等待以後收集
C代碼
/*
線性結構數組的實現
*/
#include <stdio.h>
#include <malloc.h> //包含了malloc函數
#include <stdlib.h> //包含了exit函數
//首先定義描述數組信息的結構體類型
struct Arr
{
int * pBase;//存放數組首地址的指針變量
int len;//數組長度
int cnt;//數組中元素的個數
};
//定義數組的基本操作的函數聲明
void init_arr(struct Arr * pArr,int length);//數組初始化
bool append_arr(struct Arr * pArr,int val);//追加元素
bool insert_arr(struct Arr * pArr,int index ,int val);//插入元素
bool delete_arr(struct Arr * pArr, int pos, int * pVal);//刪除元素
int get(struct Arr *pArr,int index); //得到元素
bool is_empty(struct Arr * pArr);//判斷是否為空
bool is_full(struct Arr * pArr);//判斷是否已滿
void show_arr(struct Arr * pArr);//遍歷數組
void inversion_arr(struct Arr * pArr);//數組倒置
void one_sort(int *sqList,int val,int len);//單步排序聲明
void straisort(struct Arr * pArr);//直接插入排序聲明
int main(void)
{
struct Arr arr;
init_arr(&arr,6);//初始化函數測試
//show_arr(&arr);
append_arr(&arr,3);
append_arr(&arr,2);
append_arr(&arr,9);
insert_arr(&arr,2,7);
show_arr(&arr);
return 0;
}
//初始化數組的函數實現 pArr是結構體變量arr的指針
void init_arr(struct Arr * pArr,int length)
{
pArr->pBase=(int *)malloc(sizeof(int)*length);//malloc()函數頭文件聲明
if(NULL==pArr->pBase)
{
printf("動態內存分配失敗!\n");
exit(-1);//要在頭文件聲明
}
else
{
pArr->len=length;
pArr->cnt=0;
}
}
//遍歷數組函數實現
void show_arr(struct Arr * pArr)
{
if(is_empty(pArr))
{
printf("數組為空\n");
}
else
{
for(int i=0;i<pArr->cnt;i++)
{
printf("%d",pArr->pBase[i]);
}
}
}
//判斷數組是否為空
bool is_empty(struct Arr * pArr)
{
if(pArr->cnt==0)
return true;
else
return false;
}
//數組追加元素
bool append_arr(struct Arr * pArr,int val)
{
if(pArr->cnt < pArr->len)
{
pArr->pBase[pArr->cnt]=val;
(pArr->cnt)++;
return true;
}
else
printf("數組已滿\n");
return false;
}
//插入元素
bool insert_arr(struct Arr * pArr,int index ,int val)
{
if(pArr->cnt<pArr->len&&index<=pArr->cnt)
{
for(int i=pArr->cnt-1;i>=index-1;i--)
{
pArr->pBase[i+1]=pArr->pBase[i];
}
pArr->pBase[index-1]=val;
(pArr->cnt)++;
return true;
}
else
{
printf("插入失敗\n");
return false;
}
}
//單步直接插入排序實現
void one_sort(int *sqList,int val,int len)
{
int pos=len;
int temp=val;
while(val<sqList[pos-1]&&pos>0)
{
sqList[pos]=sqList[pos-1];
pos--;
}
sqList[pos]=temp;
}
//直接插入排序實現
void straisort(struct Arr * pArr)
{
for(int i=1;i<pArr->cnt;i++)
{
one_sort(pArr->pBase,pArr->pBase[i],i);//調用單步排序
}
}
//數組倒置
void inversion_arr(struct Arr * pArr )
{
int i = 0;
int j = pArr->cnt-1;//首尾下標的呼應關系
int t;
while (i < j)
{
t = pArr->pBase[i];
pArr->pBase[i] = pArr->pBase[j];
pArr->pBase[j] = t;
i++;
j--;
}
return;
}
//刪除元素
bool delete_arr(struct Arr * pArr, int pos, int * pVal)
{
int i;
if ( is_empty(pArr) )
return false;
if (pos<1 || pos>pArr->cnt)
return false;
*pVal = pArr->pBase[pos-1];
for (i=pos; i<pArr->cnt; i++)
{
pArr->pBase[i-1] = pArr->pBase[i];
}
pArr->cnt--;
return true;
}
//判斷是否已滿
bool is_full(struct Arr * pArr)
{
if (pArr->cnt == pArr->len)
return true;
else
return false;
}
//查找元素
int get(struct Arr *pArr,int index)
{
for(int i=0;i<pArr->cnt;i++)
{
if(index==i)
{
return pArr->pBase[i];
}
}
}