数据结构day3

顺序表按元素删除

顺序表按元素修改

顺序表去重

顺序表排序

顺序表有序合并

顺序表释放空间

head.h

#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXSIZE 100
typedef int data_type;

//定义顺序表结构体
typedef struct SQLIST
{
	//数据元素
	data_type data[MAXSIZE];
	//顺序表长度
	int len;
}sqlist;

sqlist* create_space();
int full_sqlist(sqlist *list);
int insert_rear(sqlist *list,data_type element);
void Output(sqlist *list);
int Delete_rear(sqlist *list);
void search_index(sqlist *list,int index);
int Change_index(sqlist *list,int index,data_type element);
int Insert_index(sqlist *list,int index,data_type element);
int Delete_index(sqlist *list,int index);
int search_element(sqlist *list,data_type key);
void Delete_element(sqlist *list,data_type key);
void Change_element(sqlist *list,data_type key,data_type element);
void Quchong(sqlist *list);
void Sort_list(sqlist *list);
void Input_list(sqlist *list);
void Combine_list(sqlist *la,sqlist *lb,sqlist *lc);
sqlist*  Free_list(sqlist *list);
#endif

main.c

#include "head.h"

int main(int argc, const char *argv[])
{
	sqlist *list=create_space();//创建空间
//	Input_list(list);


	int index; 
	data_type element; 
/*	Output(list);
	Delete_rear(list);//尾删
	Delete_rear(list);
	Output(list);
*/
	
/*	printf("please enter search index:");
	scanf("%d",&index);
	search_index(list,index);//按下表查找

	printf("please enter change index:");
	scanf("%d",&index);
	printf("please enter change element:");
	scanf("%d",&element);
	Change_index(list,index,element);//按下表修改
	Output(list);
*/ 	

/*	Output(list);
	printf("please enter insert index:");
	scanf("%d",&index);
	printf("please enter insert element:");
	scanf("%d",&element);
	Insert_index(list,index,element);//按下表插入
	Output(list);
*/

/*	Output(list);
	printf("please enter delete index:");
	scanf("%d",&index);
	Delete_index(list,index);//按下表删除
	Output(list);
*/

/*	Output(list);
	data_type key;
	printf("please enter search key:");
	scanf("%d",&key);
	int key_index=search_element(list,key);//按元素查找
	if(key_index==-1){
		printf("search key unexist\n");
	}else{
	printf("search key index is:%d\n",key_index);
	}
*/

	
/*	Output(list);
	data_type key;
	printf("please enter delete key:");
	scanf("%d",&key);
	Delete_element(list,key);//按元素删除
	Output(list);
*/

/*	Output(list);
	data_type key;
	printf("please enter change key:");
	scanf("%d",&key);
	printf("please enter change element:");
	scanf("%d",&element);
	Change_element(list,key,element);//按元素修改
	Output(list);
*/	

/*	Output(list);
	Quchong(list);//顺序表去重
	Output(list);
*/

/*	Output(list);
	Sort_list(list);//顺序表排序
	Output(list);
*/

/*	sqlist *la=create_space();//创建空间
	sqlist *lb=create_space();
	sqlist *lc=create_space();
	Input_list(la);
	Input_list(lb);
	Sort_list(la);
	Sort_list(lb);
	Combine_list(la,lb,lc);//顺序表有序合并
	Output(lc);
*/

	list=Free_list(list);//释放顺序表空间

	
	
	return 0;
}

test.c

#include "head.h"

//堆区申请空间
sqlist* create_space(){
	sqlist *list=(sqlist *)malloc(sizeof(sqlist));
	if(NULL==list){//判断顺序表是否创建
		return NULL;//失败返回NULL
	}
	//对顺序表长度清0
	list->len=0;
	//对数据元素清0
	memset(list->data,0,sizeof(list->data));
	return list;//成功返回list
}

void Input_list(sqlist *list){
	int n;
	printf("please enter n:");
	scanf("%d",&n);
	data_type element;
	for(int i=0;i<n;i++){
		printf("please enter %d element:",i+1);
		scanf("%d",&element);
	int flag=insert_rear(list,element);//尾插入
	if(flag==-1){
		puts("sqlist full or error");
		break;
		}
	}
}

//判断顺序表满
int full_sqlist(sqlist *list){
	return list->len==MAXSIZE?-1:0;
}
//判断顺序表为空
int empty_sqlist(sqlist *list){
	return list->len==0?-1:0;
}

//尾插入
int insert_rear(sqlist *list,data_type element){
	if(NULL==list || full_sqlist(list)){
		return -1;
	}
	list->data[list->len++]=element;
	return 0;
}

//循环输出
void  Output(sqlist *list){
	//判断顺序表是否创建和是否为空
	if(NULL==list || empty_sqlist(list)){
		return;
	}
	for(int i=0;i<list->len;i++){
		printf("%d\t",list->data[i]);
	}
	puts("");
}

//尾删
int Delete_rear(sqlist *list){
	//判断顺序表是否创建和是否为空
	if(NULL==list || empty_sqlist(list)){
		return -1;
	}
	list->len--;
	return 0;
}

//按下表查找
void search_index(sqlist *list,int index){
	//判断顺序表是否创建和是否为空
	//判断下表是否合法
	if(NULL==list||empty_sqlist(list)||index<0||index>=list->len){
		printf("search error");
		return;
	}
	printf("search element is: %d\n",list->data[index]);
}

//按下表修改
int Change_index(sqlist *list,int index,data_type element){
	//判断顺序表是否创建和是否为空
	//判断下表是否合法
	if(NULL==list||empty_sqlist(list)||index<0||index>=list->len){
		printf("change  error");
		return -1;
	}
	list->data[index]=element;//修改
	return 0;
}

//按下表插入
int Insert_index(sqlist *list,int index,data_type element){
	//判断顺序表是否创建和是否为满
	//判断下表是否合法
	if(NULL==list||full_sqlist(list)||index<0||index>list->len){
		printf("insert error");
		return -1;
	}
	//循环后移
	for(int i=list->len-1;i>=index;i--){
		list->data[i+1]=list->data[i];
	}
	//插入
	list->data[index]=element;
	//顺序表长度加1
	list->len++;
	return 0;
}

//按下表删除
int Delete_index(sqlist *list,int index){
	//判断顺序表是否创建和是否为空
	//判断下表是否合法
	if(NULL==list || empty_sqlist(list) || index<0 || index>=list->len){
		printf("delete error");
		return -1;
	}
	//删除,循环前移
	for(int i=index;i<list->len-1;i++){
		list->data[i]=list->data[i+1];
	}
	//顺序表长度减1
	list->len--;
	return 0;
}

//按元素查找
int search_element(sqlist *list,data_type key){
	//判断顺序表是否创建和是否为空
	if(NULL==list || empty_sqlist(list)){

		return -1;
	}
	for(int i=0;i<list->len;i++){
		if(list->data[i]==key){
			return i;
		}
	}

	return -1;
}

//按元素删除
void Delete_element(sqlist *list,data_type key){
	int key_index=search_element(list,key);
	if(key_index==-1){
		printf("key unexist\n");
	}else{
		Delete_index(list,key_index);
	}
}

//按元素修改
void Change_element(sqlist *list,data_type key,data_type element){

	int key_index=search_element(list,key);
	if(key_index==-1){
		printf("key unexist\n");
	}else{
		Change_index(list,key_index,element);
	}
}

//顺序表去重
void Quchong(sqlist *list){
	//判断顺序表是否创建和是否为空
	if(NULL==list || empty_sqlist(list)){
		return;
	}
	//循环比较,去重
	for(int i=0;i<list->len-1;i++){
		for(int j=i+1;j<list->len;j++){
			if(list->data[i]==list->data[j]){
				Delete_index(list,j);  
				j--;  //防止漏删                     
			}                    
		}                
	}
}

//顺序表排序
void Sort_list(sqlist *list){
	//判断顺序表是否创建和是否为空
	if(NULL==list || empty_sqlist(list)){
		return;
	}
	//简单选择排序
	for(int i=0;i<list->len-1;i++){
		int min=i;
		for(int j=i+1;j<list->len;j++){
			if(list->data[min]>list->data[j]){
				min=j;	                
			}                    
		}
		if(min!=i){
			data_type t=list->data[i];
			list->data[i]=list->data[min];
			list->data[min]=t;
		}
	}
}

//顺序表有序合并
void Combine_list(sqlist *la,sqlist *lb,sqlist *lc){
	int p=0; //la的下表
	int q=0; //lb的下表
	//la和lb都不为空时,比较之后放入lc
	while(p<la->len && q<lb->len){
		if(la->data[p] <= lb->data[q]){
			lc->data[lc->len++]=la->data[p++];

		}else{
			lc->data[lc->len++]=lb->data[q++];
		}
	}
	//将la剩余的元素放进lc中
	while(p<la->len){
		lc->data[lc->len++]=la->data[p++];
	}
	//将lb剩余的元素放进lc中
	while(q<lb->len){
		lc->data[lc->len++]=lb->data[q++];
	}
}

//顺序表释放空间
sqlist* Free_list(sqlist *list){
    if(NULL==list){
        return NULL;
	}
    //释放堆区内存
    free(list);
    list=NULL;//防止野指针
   return list;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值