数据结构学习整理-顺序表
动态的增加表空间-动态顺序表
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define InitSize 10
#define IncreaseSize 10
typedef struct{
int *elem;
int length;
int SqlSize;
}SqList;
SqList CreateSql();
void PrintfSql(SqList L);
void PrintfById(SqList L,int i);
void DeleteById(SqList &L,int i,int &e);
void InsertById(SqList &L,int i,int e);
void ModifyById(SqList &L,int i,int e);
int CountByValue(SqList L,int e);
int main(){
SqList L = CreateSql();
printf("遍历输出顺序表L:");
PrintfSql(L);
int i;
printf("输入指定输出为位置:");
scanf("%d",&i);
PrintfById(L,i);
printf("\n");
int j,e;
printf("输入指定删除的位置:");
scanf("%d",&j);
DeleteById(L,i,e);
printf("删除的元素值为:%d\n",e);
printf("删除第%d个元素后的顺序表为:",j);
PrintfSql(L);
int k,a;
printf("输入插入的位置k和插入的元素值a:");
scanf("%d %d",&k,&a);
InsertById(L,k,a);
printf("向L表的第%d位置插入%d后的顺序表为:",k,a);
PrintfSql(L);
int n,data;
printf("输入修改位n值和指定的数据data:");
scanf("%d %d",&n,&data);
ModifyById(L,n,data);
printf("修改后的顺序表为:");
PrintfSql(L);
int count = 0;
int s;
printf("输入需要查找的值S:");
scanf("%d",&s);
count = CountByValue(L,s);
printf("顺序表L中与s值相等的元素有%d个\n",count);
printf("输出表L的借本信息如下:");
printf("表长为%d,总的表空间为%d,未分配元素的表空间为%d",L.length,L.SqlSize,L.SqlSize-L.length);
return 0;
}
SqList CreateSql(){
SqList P;
P.length = 0;
if((P.elem = (int *) malloc (InitSize * sizeof(int))) == NULL){
printf("内存空间分配失败!!");
exit(1);
}
P.SqlSize = InitSize;
for(int i = 0; i <= 30;i++){
if(P.length >= P.SqlSize){
printf("内存空间不足,需增加空间!\n");
int k = 31 - P.SqlSize;
int temp = 1;
if(k % IncreaseSize == 0){
temp = k / IncreaseSize;
}
else{
temp = k / IncreaseSize + 1;
}
if(!((P.elem = (int *) realloc
(P.elem,((P.SqlSize + k * IncreaseSize) * sizeof(int))))))
{
printf("分配空间失败!!!");
exit(1);
}
Sleep(3000);
printf("内存增加成功!\n");
Sleep(1500);
P.SqlSize = P.SqlSize + temp * IncreaseSize;
}
P.elem[i] = i;
P.length ++;
}
return P;
}
void PrintfSql(SqList L){
for(int i = 0;i < L.length;i++){
printf("%d ",L.elem[i]);
}
printf("\n");
}
void PrintfById(SqList L,int i){
if(i < 1 || i > L.length){
printf("指定位置不符合!");
exit(1);
}
printf("顺序表的第%d个数据元素是:%d",i,L.elem[i - 1]);
}
void DeleteById(SqList &L,int i,int &e){
if(i < 1 || i > L.length){
printf("删除位置不符合!!");
return;
}
e = L.elem[i - 1];
for(int j = i; j < L.length;j++){
L.elem[j - 1] = L.elem[j];
}
L.length--;
}
void InsertById(SqList &L,int i,int e){
if(L.length == L.SqlSize){
printf("表空间已满,需要再次分配表空间!");
if(!(L.elem = (int *) realloc (L.elem,((L.SqlSize + IncreaseSize) *sizeof(int))))){
printf("空间分配失败!!");
exit(1);
}
Sleep(2000);
printf("空间已分配成功!");
Sleep(1200);
L.SqlSize = L.SqlSize + IncreaseSize;
}
for(int j = L.length; j >= i; j--){
L.elem[j] = L.elem[j-1];
}
L.elem[i-1] = e;
L.length++;
}
void ModifyById(SqList &L,int i,int e){
if(i < 1 || i > L.length || L.length == 0){
printf("位置i越界或者线性表为空!!");
return;
}
L.elem[i -1] = e;
}
int CountByValue(SqList L,int e){
if(L.length == 0){
return 0;
}
int count = 0;
for(int i = 0; i < L.length ; i++){
if(L.elem[i] == e){
count++;
}
}
return count;
}
|