线性表的基本操作 (C语言)
/#include <stdio.h>
/#include <stdlib.h>
/#define Initsize 5
//typedef 重命名struct为 SqList
typedef struct{
int *data; //指示动态分配数组的指针
int Maxsize;//顺序表的最大长度
int length; //顺序表的当前长度
}SqList;
void InitList(SqList &L){
L.data= (int )malloc(Initsizesizeof(int));
L.length=0;
L.Maxsize = Initsize;
}
//冒泡排序 从小到大
void SortList(SqList &L){
int t;
printf("冒泡排序后如下:
");
for(int i=0; i<L.length-1; i++){
for(int j=0; j<L.length-1-i; j++){
if(L.data[j]>L.data[j+1])
{
t = L.data[j];
L.data[j] = L.data[j+1];
L.data[j+1]=t;
}
}
}
}
//在第i个位置插入 一个数值
bool Listinsert(SqList &L,int i,int e){
printf("~~~~~~~~~~~
");
printf("数据长度:%d
", L.length);
if(i<1||i>L.length+1)//判断要插入的位置是否合法
return false;
if(L.length>=L.Maxsize)//判断数组是否已满 等于的时候数组也已经满了
return false;
for(int j=L.length; j>=i; j--){//for循环 从最后一个往下移动 此时j=L.length 刚好 为数组的最后一个的下一个位置。
L.data[j] = L.data[j-1];
}
//printf("22
");
L.data[i-1] = e;//移动完成后 把数值插入数组位置为i-1 的下标位置
L.length++;//此时数组的长度要增加一。
return true;
}
void printList(SqList &L){
for(int i=0; i<L.length; i++){
//scanf("%d",&L.data[i]);
printf("data[%d]=%d
",i,L.data[i]);
}
}
//查找元素并返回元素的地址;
int FindList(SqList &L,int i){
// printf("%d
",L.length);
for(int j=0; j<L.length; j++)
if(L.data[j]==i)
printf("已找到%d元素,其对应的位置是%d
",i,j+1);
return 0;
}
//用malloc函数对数组进行扩容:其原理是重新申请(L.Maxsize+len)的长度的内存空间。 再把之前的数据复制过去。
void IncreaseSize(SqList &L,int len){
int *p = L.data;//复制之前先用一个指针保存 其地址。
L.data = (int )malloc((L.Maxsize+len)sizeof(int));
for(int i=0; i<L.length; i++)
{
L.data[i] = p[i];
}
L.Maxsize = L.Maxsize + len;//修改Maxsize的值。
// printf("221
");
free(p);//释放原来的内存。
}
//删除指定位序的所对应的值
bool deleteList(SqList &L, int i, int &e){
if(i<1||i>L.length)
return false;
e = L.data[i-1];//删除之前保存其值用于返回、
for(int j=i; j<L.length; j++)
L.data[j-1] = L.data[j];
L.length--;
return true;
}
int main()
{
SqList L;
InitList(L);
int n,a;
printf("请输入数据个数:");
scanf("%d", &n);
if(n>=Initsize)//如果输入数据的数量>Initsize 则进行扩容。 (存在问题:之前申请的内存没有释放)
L.data = (int )malloc((L.Maxsize+n)sizeof(int));
L.Maxsize = L.Maxsize+n;
printf("此时数组的最大容量是%d
",L.Maxsize);
printf("请输入一组数据:
");
for (int i = 0; i < n; i++){
scanf("%d",&L.data[i]);
L.length++;
}
printList(L);//输出线性表
SortList(L);//对数组进行冒泡排序
printList(L);
Listinsert(L,4,0);//插入数据
printf("在第4个位置成功插入数据'0'!
");
printf("此时新的线性表为:
");
printList(L);
int e=-1;
if(deleteList(L,6,e)){
printf("已经成功删除第6个元素,对应的值是%d
",e);
}//删除元素
else
printf("删除失败!!");
printf("删除后的线性表为:
");
printList(L);
FindList(L,4);//按位查找
IncreaseSize(L,5);//用malloc函数动态扩容。
printf("经过扩容后最终Maxsize为:%d
",L.Maxsize);
// for(int i=0; i<L.Maxsize; i++){
// //scanf("%d",&L.data[i]);
// printf("data[%d]=%d
",i,L.data[i]);
// }
return 0;
}