在codeblock上通过两个.c文件和一个.h文件完成这个顺序表
我们把各种头文件包含在SeqList.h里面,把各种函数实现的功能放在SeqList.c文件里
main.c里面放我们的框架
main.c里的内容
#include "SeqList.h"
void menu()
{
printf("**********************************************\n");
printf("*******[1]push_back [2]push_front*******\n");
printf("*******[3]show_list [4]insert************\n");
printf("*******[5]pop_back [6]pop_front*********\n");
printf("*******[7]erase_pos [8]erase_val**********\n");
printf("*******[9]find [10]size****************\n");
printf("*******[11]sort [12]reverse***************\n");
printf("*******[13]clear [14]quit******************\n");
printf("*******[15]cls ***************************\n");
printf("***************************************************\n");}
int main()
{
SeqList list;
initlist(&list);
menu();
int select=-1;
int index=-1;
int item=-1;
while(1)
{
printf("请选择:>\n");
scanf("%d",&select);
switch(select)
{
case 1:
printf("请输入要插入的元素:(输入-1就停止插入)>\n");
while(scanf("%d",&item),item!=-1)
{
push_back(&list,item);
}
break;
case 2:
printf("请输入要插入的元素:>(输入-1就停止插入)\n");
while(scanf("%d",&item),item!=-1);
{
push_front(&list,item);
}
break;
case 3:
printf("DATA:>\n");
show_list(&list);
break;
case 4:
printf("请输入要插入的下标和数据:>\n");
scanf("%d%d",&index,&item);
insert(&list,index,item);
break;
case 5:
pop_back(&list);
printf("尾部删除成功!\n");
break;
case 6:
pop_front(&list);
printf("头部删除成功!\n");
break;
case 7:
printf("请输入要删除元素的下标:>\n");
scanf("%d",&index);
erase_pos(&list,index);
printf("指定元素下标删除成功!\n");
break;
case 8:
printf("请输入要删除的元素:>\n");
scanf("%d",&item);
erase_val(&list,item);
printf("指定元素删除成功!\n");
break;
case 9:
printf("请输入要查找的元素:>\n");
scanf("%d",&item);
int ret=find(&list,item);
if(ret==-1)
{
printf("没有找到%d\n",item);
}
else
{
printf("找到了%d,下标是%d\n",item,ret);
}
break;
case 10:
printf("当前元素个数:%d\n",size(&list));
break;
case 11:
sort(&list);
break;
case 12:
reverse(&list);
break;
case 13:
clear(&list);
break;
case 14:
exit(0);
break;
case 15:
system("cls");
menu();
break;
}
}
return 0;
}
SeqList.h里的内容
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
#define INIT_SEQLIST_SIZE 8//抽象数据类型
typedef int Data;
typedef struct
{
Data* base;//指向首地址的指针
int capacity;//数组的最大容量
int size;//当前元素数量}SeqList;
void initlist(SeqList* list);
void push_back(SeqList* list,Data data);
void show_list(SeqList* list);
void push_front(SeqList* list,Data data);
void insert(SeqList* list,int index,Data data);
bool empty(SeqList *list);
void pop_back(SeqList* list);
void pop_front(SeqList* list);
void erase_pos(SeqList* list,int index);
void erase_val(SeqList* list,Data data);
int find(SeqList* list,Data item);
int size(SeqList *list);
void sort(SeqList* list);
void reverse(SeqList* list);
void clear(SeqList* list);
SeqList.c 里的内容
#include "SeqList.h"
void initlist(SeqList *list)
{list->capacity=INIT_SEQLIST_SIZE;
list->size=0;
list->base=calloc(list->capacity,sizeof(Data));
assert(list->base!=NULL);//如果分配失败,直接中断}
void push_back(SeqList* list,Data data)
{if(list->capacity==list->size)
{
return;
}
list->base[list->size]=data;//插入数据
list->size++;}
void show_list(SeqList* list)
{int i=0;
for(i=0;i<list->size;i++)
{
printf("%d ",list->base[i]);}
printf("\n");
}
void push_front(SeqList* list,Data data)
{
if(list->capacity==list->size)
{
return;
}
int i=0;
//首元素移动
for(i=list->size;i>0;i--)
{
list->base[i]=list->base[i-1];
}
list->base[0]=data;
list->size++;
}
void insert(SeqList* list,int index,Data data)
{
if(index<0 || index >list->size)
{
printf("插入位置错误!\n");
return;
}
int i=0;
for(i=list->size;i>index;i--)
{
list->base[i]=list->base[i-1];
}
list->base[index]=data;
list->size++;
}
void pop_back(SeqList* list)
{
if(!empty(list))
{
list->size--;
}}
bool empty(SeqList* list)
{
return list->size==0;
}void pop_front(SeqList* list)
{
if(empty(list))
return;
int i=0;
for(i=0;i<list->size-1;i++)
{
list->base[i]=list->base[i+1];
}
list->size--;
}void erase_pos(SeqList* list,int index)
{
if(empty(list))
return;
int i=0;
for(i=index;i<list->size-1;i++)
{
list->base[i]=list->base[i+1];
}
list->size--;
}
void erase_val(SeqList* list,Data item)
{
if(empty(list))
return;
int ret=find(list,item);
if(ret!= -1)
{
if(ret==list->size-1)
list->size--;
else
{int i=0;
for(i=ret;i<=list->size-1;i++)
{
list->base[i]=list->base[i+1];
}
list->size--;
}
}
}
int find(SeqList* list,Data item)
{
int i=0;
for(i=0;i<list->size;i++)
{
if(list->base[i]==item)
{
return i;
}
}
return -1;
}int size(SeqList* list)
{
return list->size;}
void sort(SeqList* list)
{int i=0;
int flag=1;
for(i=0;i<list->size-1;i++)
{
flag=0;//重置flag=0说明当前序列已完全有序
int j=0;
for(j=0;j<list->size-1-i;j++)
{
if(list->base[j]>list->base[j+1])
{
Data temp=list->base[j];
list->base[j]=list->base[j+1];
list->base[j+1]=temp;
flag=0;//说明不完全有序
}
}
if(flag==1)
{
break;
}
}
}
void reverse(SeqList* list)
{int i=0;
for(i=0;i<list->size/2;i++)//只需要遍历一半是因为在逆序操作中,从两端向中间交换元素即可完成整个逆序操作
{
Data t=list->base[i];//将第 i 个元素存储在临时变量 t 中
list->base[i]=list->base[list->size-i-1];//将顺序表中的第 i 个元素置换为其对应位置上倒数第 i 个元素的值
list->base[list->size-1-i]=t;//临时变量 t 的值赋给倒数第 i 个位置的元素,完成了对两个位置元素的交换。
}
}
void clear(SeqList* list)
{
list->size=0;
free(list->base);
list->base=NULL;
}