数据结构线性表学习汇总

#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);		
} 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr pan cheng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值