#include <stdio.h>
#include<malloc.h>
#define MaxSize 10
#define Size 5
typedef struct{
int*data;
int dlen;
int len;
}SqList;
/*初始化线性表*/
void Sq_Init(SqList*L){
L->data=(int*)malloc(MaxSize*sizeof(int));
if(!L->data){
printf("分配内存空间失败!");
}
else{
L->dlen=0;
L->len=MaxSize;
}
};
/*打印线性表*/
void Printf_Sq(SqList*L){
int i;
if(!L->data){
printf("线性表不存在");
}
else{
for(i=0;i<=L->dlen-1;i++){
printf("%d\t",L->data[i]);
}
}
}
/*增加线性表空间*/
int ZSq(SqList*L){
//重更新分配存储空间
int *p = L->data;
L->data = (int*)malloc((L->len+Size)*sizeof(int));
int i;
for(i=0;i<L->len;i++){
L->data[i] = p[i];
}
L->len = L->len+Size;
free(p);
}
/*插入数据到线性表,输入数据在表尾部*/
void InsetData(SqList*L,int x){
if(!L->data){
printf("线性表不存在");
}
else {
int i;
L->dlen++;//长度先增加才能存数据
i=L->dlen-1;
L->data[i]=x;
}
};
/*销毁线性表*/
void DestryList(SqList*L){
free(L->data);
};
/*重置线性表*/
void ClearList(SqList*L){
L->dlen=0;
};
/*给定一个位置插入数据*/
void Insetother(SqList*L,int i,int x){
//插入线性表,位置,数据
int j;
if(i<1||i>L->dlen+1){
printf("插入数据位置有误\n");
}
else if(L->dlen==L->len){
printf("存储空间满了插入不了\n");
}
else {
L->dlen++;//插入数据先扩充长度
//插入的位置后面的数据往后移,位置i的实际存储地址i-1,
//i-1这个插入前也有数据往后移动
for(j=L->dlen-1;i-1<=j;j--){
L->data[j+1]=L->data[j];
}
L->data[i-1]=x;//i-1位置空出来,放入插入数据
Printf_Sq(L);
}};
/*删除指定位置的数据*/
void Delete(SqList*L,int x){
//线性表,数据的位置
int j;
//删除的数据必须是线性表有的
if(1>x |x>L->dlen ){
printf("删除数据不在线性表数据范围\n");
}
else {
//删除的这个位置空缺,后面的数据往前填充,从删除位置开始
for(j=x;j<=L->dlen-1;j++){
L->data[j-1]=L->data[j];
}
L->dlen--;//删除后长度减一
printf("删除成功\n");
Printf_Sq(L);
}
}
/*将数据前后反转*/
void Turn(SqList*L){
int i,j,temp;
//奇数反转
if((L->dlen)%2==1){
i=(L->dlen+1)/2;
for(j=0;j<i;j++){
temp=L->data[j];
L->data[j]=L->data[L->dlen-j-1];
L->data[L->dlen-j-1]=temp;
}
}
//偶数反转
else if((L->dlen)%2==0){
i=(L->dlen)/2;
for(j=0;j<i;j++){
temp=L->data[j];
L->data[j]=L->data[L->dlen-j-1];
L->data[L->dlen-j-1]=temp;
}
}
for(i=0;i<=L->dlen-1;i++){
printf("%d\t",L->data[i]);
}
printf("\n");
}
/*查找线性表数据的位置*/
void Find(SqList*L,int x){
int i,j;
for(i=0;i<L->dlen;i++){
if(L->data[i]==x){
printf("该数据在线性表中的位置为:");
printf("%d\t",i+1);
printf("\n");
j=1;
}
else if(j==0 ){
printf("线性表不存在该数据\n");
}
}
}
/*提取某一位置的数据*/
void Tiqu(SqList*L,int x){
if(x<1||x>L->dlen){
printf("提取的位置有误\n");
}
else {
printf("抽取的数据为:");
printf("%d\n",L->data[x-1]);
}
}
/*线性表从小到大排序*/
void MinP(SqList*L){
int i,j,temp,p;
for(i=0;i<L->dlen;i++){
for(j=i;j<L->dlen;j++){
if(L->data[i]>L->data[j]){
temp=L->data[i];
L->data[i]=L->data[j];
L->data[j]=temp;
}
}
}
printf("小到大排序后的内容:\n");
Printf_Sq(L);
printf("\n");
}
/*线性表从大到小排序*/
void MaxP(SqList*L){
int i,j,temp,p;
for(i=0;i<L->dlen;i++){
for(j=i;j<L->dlen;j++){
if(L->data[i]<L->data[j]){
temp=L->data[i];
L->data[i]=L->data[j];
L->data[j]=temp;
}
}
}
printf("大到小排序后的内容:\n");
Printf_Sq(L);
printf("\n");
}
/*
如果是C++引用的话直接加初始化变量,如果是指针的话需要加取地址&
*/
int main(){
SqList L;
int y,i,x,a,b;
Sq_Init(&L);
printf("请输入线性表数据不大于10的个数:");
scanf("%d",&y);
printf("你输入的个数为:\t");
printf("%d\n",y);
for(i=0;i<y;i++){
scanf("%d",&x);
InsetData(&L,x);
}
printf("线性表中的内容:\n");
Printf_Sq(&L);
printf("\n");
printf("请选择插入数据的位置及数据:\n");
scanf("%d%d",&a,&b);
Insetother(&L,a,b);
printf("\n");
printf("请选择清除数据的位置及数据:\n");
scanf("%d",&b);
Delete(&L,b);
printf("\n");
printf("请选择要查找的数据:\n");
scanf("%d",&x);
Find(&L,x);
printf("是否需要反转数据\n");
scanf("%d",&x);
printf("你输入的结果是:");
if(x==0){
printf("否\n");
}
else if(x==1){
printf("是\n");
printf("反转后的数据为:\n");
Turn(&L);
}
printf("请输入你要抽取数据的数据位置\n");
scanf("%d",&x);
Tiqu(&L,x);
MinP(&L);
MaxP(&L);
DestryList(&L);
}
数据结构线性表学习汇总
最新推荐文章于 2024-07-24 15:28:00 发布