seqlish.h:头文件
#include <stdio.h>
#include <malloc.h>
#include <assert.h>
#define SEQLIST_INIT_SIZE 8
#define INC 3
typedef int ElemType;
typedef struct SeqList{
ElemType *base;
int capacity;
int size;
}SeqList;
void InitSeqList(SeqList *list);
void push_back(SeqList *list,ElemType x);
void push_front(SeqList *list,ElemType x);
void show_list(SeqList *list);
void pop_back(SeqList *list);
void pop_front(SeqList *list);
void insert_pos(SeqList *list,int pos,ElemType x);
int find(SeqList *list,ElemType x);
int length(SeqList *list);
void delete_pos(SeqList *list,int pos);
void delete_val(SeqList *list,ElemType val);
void clean(SeqList *list);
void destory(SeqList *list);
void sortMP(SeqList *list);
void resver(SeqList *list);
int inc(SeqList *list);
seqlist.c:顺序表具体实现
#include "seqlist.h"
int inc(SeqList *list){
ElemType *newbase = (ElemType *)realloc(list->base,sizeof(ElemType)*(SEQLIST_INIT_SIZE+INC));
if(newbase == NULL){
printf("分配内存空间失败,内存不足\n");
return 0;
}
list->base = newbase;
list->capacity += INC;
return 1;
}
void InitSeqList(SeqList *list){
//开辟空间
list->base = (ElemType *)malloc(sizeof(ElemType)*SEQLIST_INIT_SIZE);
assert(list->base!=NULL);
//大小初始化
list->capacity = SEQLIST_INIT_SIZE;
list->size = 0;
}
void push_back(SeqList *list,ElemType x){
//判满
if(list->size >= list->capacity && !inc(list)){
printf("顺序表空间已经满了\n");
return;
}
//插入数据
list->base[list->size]=x;
//长度增加
list->size++;
}
void push_front(SeqList *list,ElemType x){
//if 满
if(list->size >=list->capacity && !inc(list)){
printf("顺序表空间已经满了\n");
return;
}
//移动后面的元素
for(int i=list->size;i>0;--i){
list->base[i]=list->base[i-1];
}
//首位插入数据
list->base[0]=x;
list->size++;
}
void show_list(SeqList *list){
for(int i=0;i<list->size;++i){
printf("%d ",list->base[i]);
}
printf("\n");
}
void pop_back(SeqList *list){
//判空
if(list->size == 0){
printf("当前为空\n");
return;
}
printf("取出最后一个元素为:%d\n",list->base[list->size-1]);
list->size--;
}
void pop_front(SeqList *list){
//判空
if(list->size == 0){
printf("当前为空\n");
return;
}
printf("取出第一个元素为:%d\n",list->base[0]);
//移动元素
for(int i=list->size-1;i>0;i--){
list->base[i-1]=list->base[i];
}
list->size--;
}
void insert_pos(SeqList *list,int pos,ElemType x){
//判断插入位置合法性
if(pos>list->size||pos<0){
printf("输入不合法\n");
}
if(list->size >=list->capacity && !inc(list)){
printf("顺序表空间已经满了\n");
return;
}
if(pos == 0){
push_front(list,x);
}else if(pos == list->size){
push_back(list,x);
}else{
for(int i=list->size;i>pos;i--){
list->base[i]=list->base[i-1];
}
list->base[pos]=x;
list->size++;
}
}
int find(SeqList *list,ElemType x){
for(int i=0;i<list->size;i++){
if(list->base[i]==x){
printf("当前查找数在顺序表的的下标为%d,在第%d位\n",i,i+1);
return i;
}
}
printf("查找结束,未找到对应的数据\n");
return -1;
}
int length(SeqList *list){
return list->size;
}
void delete_pos(SeqList *list,int pos){
if(pos>list->size||pos<0){
printf("输入不合法\n");
}
for(int i=pos;i<list->size-1;i++){
list->base[i]=list->base[i+1];
}
list->size--;
}
void delete_val(SeqList *list,ElemType x){
int pos = find(list,x);
if(pos != -1){
delete_pos(list,pos);
}
}
void clean(SeqList *list){
list->size = 0;
}
void destory(SeqList *list){
free(list->base);
list->base = NULL;
list->capacity = 0;
list->size = 0;
}
void sortMP(SeqList *list){
//冒泡排序思想:
//多次遍历,两两比对,大后小前
//这个是比较的躺数,一共n个数,比较n-1躺 。
for(int i =0;i<list->size-1;i++){
//每一趟的比较次数,随着躺数增加,大的到了后面,比较次数减少,后面的不比
//一次比较,少比1次,n次比较,少比n次
for(int j = 0;j<list->size-i-1;j++){
if(list->base[j]>list->base[j+1]){
ElemType temp = list->base[j];
list->base[j]=list->base[j+1];
list->base[j+1]=temp;
}
}
}
}
void resver(SeqList *list){
if(list->size==0||list->size ==1) return;
int low = 0;
int high = list->size-1;
while(low<high){
ElemType temp = list->base[low];
list->base[low] = list->base[high];
list->base[high] = temp;
low++;
high--;
}
}
main.c :主函数
#include "seqlist.h"
int main(){
SeqList mylist;
InitSeqList(&mylist);
ElemType x;
int pos;
int select = 1;
while(select){
printf("*********************************\n");
printf("请输入您需要的顺序表操作\n");
printf("* 1.尾部插入 2.头部插入\n");
printf("* 3.顺序表展示 4.尾部取一个\n");
printf("* 5.头部取一个 6.插入在指定位置\n");
printf("* 7.查找 8.长度\n");
printf("* 9.按位删除 10.按值删除\n");
printf("* 11.排序 12.反置\n");
printf("* 13.清空 14.销毁\n");
printf(" 0.退出\n");
printf("*********************************\n");
printf("请选择:\n");
scanf("%d",&select);
if(select == 0) break;
switch(select){
case 1:
printf("请输入您的数据(输入-1结束)\n");
//逗号表达式,输出以最后为准
while(scanf("%d",&x),x != -1){
push_back(&mylist,x);
}
break;
case 2:
printf("请输入您的数据,系统会按顺序做头部插入(输入-1结束)\n");
while(scanf("%d",&x),x != -1){
push_front(&mylist,x);
}
break;
case 3:
show_list(&mylist);
break;
case 4:
pop_back(&mylist);
break;
case 5:
pop_front(&mylist);
break;
case 6:
printf("请输入插入的数据\n");
scanf("%d",&x);
printf("请输入插入的位置\n");
scanf("%d",&pos);
insert_pos(&mylist,pos,x);
break;
case 7:
printf("请输入查找的数据\n");
scanf("%d",&x);
find(&mylist,x);
break;
case 8:
printf("当前顺序表长度为%d\n",length(&mylist));
break;
case 9:
printf("请输入删除的顺序表下标\n");
scanf("%d",&pos);
delete_pos(&mylist,pos);
show_list(&mylist);
break;
case 10:
printf("请输入删除的顺序表元素\n");
scanf("%d",&x);
delete_val(&mylist,x);
show_list(&mylist);
break;
case 11:
sortMP(&mylist);
show_list(&mylist);
break;
case 12:
resver(&mylist);
show_list(&mylist);
break;
case 13:
clean(&mylist);
break;
case 14:
destory(&mylist);
select = 0;
break;
default:
printf("输入错误\n");
break;
}
}
destory(&mylist);
}
makefile
main.out:seqlist.o main.c
gcc seqlist.o main.c
seqlist.o:seqlist.c
gcc -c seqlist.c