数据结构1.1顺序表的基础操作

/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 ;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值