线性表的基本操作

线性表的基本操作 (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("冒泡排序后如下:\n");
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("~~~~~~~~~~~\n");
printf("数据长度:%d\n", 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\n");
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\n",i,L.data[i]);
}
}
//查找元素并返回元素的地址;
int FindList(SqList &L,int i){
// printf("%d\n",L.length);
for(int j=0; j<L.length; j++)
if(L.data[j]==i)
printf("已找到%d元素,其对应的位置是%d\n",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\n");
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\n",L.Maxsize);
printf("请输入一组数据:\n");
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'!\n");
printf("此时新的线性表为:\n");
printList(L);
int e=-1;
if(deleteList(L,6,e)){
	printf("已经成功删除第6个元素,对应的值是%d\n",e);
}//删除元素 
else 
	printf("删除失败!!"); 
printf("删除后的线性表为:\n");
printList(L);	
FindList(L,4);//按位查找 
IncreaseSize(L,5);//用malloc函数动态扩容。 
	
printf("经过扩容后最终Maxsize为:%d\n",L.Maxsize); 

// for(int i=0; i<L.Maxsize; i++){
// //scanf("%d",&L.data[i]);
// printf("data[%d]=%d\n",i,L.data[i]);
// }

return 0;

}

posted @ 2021-04-19 15:04  哇塞6  阅读(290)  评论(0编辑  收藏  举报