/2019.8.9更新
解构用动态分配
增加冒泡排序,与选择排序进行对比
增加通过下标找值,和通过值找下标
结构程序给数组,数组长度,最后一个有效元素的下标/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct LNode
{
int *data;
int MAXSIZE;
int Last; //最后一个元素的下标
} *List, Node;
List init_list(void);
bool add_list(List L, int val);
void show_list(List L);
bool is_full(List L);
bool is_empty(List L);
//下标找元素
int findKth(List L, int i);
int find(List L, int i);
bool inset(List L, int pos, int val);
bool delet(List L, int pos, int *val);
void inversion_list(List L);
void sort1_xuanze(List L);
void sort2_maopao(List L);
int main(int argc, const char *argv[])
{
int i;
int num;
int pos;
int val;
int f_val;
List Arr = init_list();
//show_list(Arr);
//printf("%d %d\n", Arr->MAXSIZE, Arr->Last);
printf(“您要输入的数据个数是:”);
while(scanf("%d", &num) && num > Arr->MAXSIZE)
{
printf(“规模错误,请重新输入。\n”);
printf(“您要输入的数据个数是:”);
}
for ( i = 0; i < num ; i++)
{
printf("第%d个数是:", (i+1));
scanf("%d",&val);
add_list(Arr, val);
}
show_list(Arr);
printf("请问你要查看第几位的元素:");
scanf("%d", &pos);
if (findKth(Arr, pos) == 0)
{
printf("该位置没有元素\n");
}
else
{
printf("第%d位的元素是 %d \n", pos, findKth(Arr, pos));
}
printf("请问在数组中查找那个元素:");
scanf("%d", &f_val);
if(find(Arr, f_val ) == -1)
{
printf("数组中没有该元素\n");
}
else
{
printf("%d 在数组中的位置是%d\n", f_val, find(Arr, f_val)+1);
}
if(inset(Arr, 3, -100))
{
show_list(Arr);
}
int hamper;
if(delet(Arr,5, &hamper))
{
show_list(Arr);
}
inversion_list(Arr);
show_list(Arr);
sort2_maopao(Arr);
show_list(Arr);
free(Arr->data);
free(Arr);
Arr = NULL;
return 0;
}
List init_list(void)
{
int list_size;
List list = (List) malloc(sizeof(Node));
if(NULL == list)
{
printf(“动态内存分配失败!”);
//exit 为终止程序的函数,()为返回给系统的参数
//-1为异常退出,其实不为零都是异常退出
//区别return, return只是返回上一级被调函数
exit(-1);
}
printf(“请出入您想要的数组长度:”);
scanf("%d", &(list->MAXSIZE));
list->data = (int *)malloc(sizeof(int) * list->MAXSIZE);
if(NULL == list->data)
{
printf("动态内存分配失败!");
exit(-1);
}
list->Last = -1;
return list;
}
bool is_full(List L)
{
if(L->Last == (L->MAXSIZE)-1)
{
return true;
}
else
{
return false;
}
}
bool add_list(List L, int val)
{
if(is_full(L))
{
printf(“List is full, operation fails.\n”);
return false;
}
else
{
L->data[++(L->Last)] = val;
return true;
}
}
bool is_empty(List L)
{
if(-1 == L->Last)
{
return true;
}
else
{
return false;
}
}
void show_list(List L)
{
int i;
if(is_empty(L))
{
printf(“List is still empty, please add ingredient first.\n”);
}
else
{
for ( i = 0; i <= L->Last; i++)
{
printf("%d “, L->data[i]);
}
printf(”\n");
}
return;
}
int findKth(List L, int i)
{
if(i <= 0 || (i-1) > L->Last)
{
return 0;
}
else
{
return L->data[i-1];
}
}
int find(List L, int f_val)
{
int i;
int pos = -1;
for (i = 0; i < L->Last; i++)
{
if (L->data[i] == f_val)
{
pos = i;
break;
}
}
return pos;
}
bool inset(List L, int pos, int val)
{
int i;
if (is_full(L))
{
printf(“manmande list\n”);
return false;
}
if(pos < 1 || pos > L-> Last+2)
{
printf(“位置不合法\n”);
return false;
}
for ( i = L->Last ; i >= (pos-1); i–)
{
L->data[i+1] = L->data[i];
}
L->data[pos-1] = val;
L->Last++;
return true;
}
bool delet(List L, int pos, int *val)
{
int i;
if (is_empty(L))
{
printf(“biaokongkong list\n”);
return false;
}
if (pos<1 || pos > L->Last+1)
{
printf(“位置非法\n”);
return false;
}
val = L->data[pos-1];
for ( i = pos; i <= L->Last; i++)
{
L->data[i-1] = L->data[i];
}
L->Last–;
return true;
}
void inversion_list(List L)
{
int i = 0, j = L->Last;
int tmp;
while (i<j)
{
tmp = L->data[i];
L->data[i] = L->data[j];
L->data[j]=tmp;
i++;
j–;
}
return;
}
void sort1_xuanze(List L)
{
int i, j;
int tmp;
for ( i = 0; i < L->Last ; i++)
{
for ( j = i + 1; j<=L->Last; j++)
{
if(L->data[i] > L->data [j])
{
tmp = L->data[i];
L->data[i] = L->data[j];
L->data[j] = tmp;
}
}
}
return;
}
void sort2_maopao(List L)
{
int i, j;
int tmp;
for ( i = 1; i <= L->Last; i++)
{
for ( j = 0; j <= (L->Last)-i; j++)
{
if(L->data[j] > L->data [j+1])
{
tmp = L->data[j];
L->data[j] = L->data[j+1];
L->data[j+1] = tmp;
}
}
}
return ;
}