顺序表按元素删除
顺序表按元素修改
顺序表去重
顺序表排序
顺序表有序合并
顺序表释放空间
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;
}