下面是顺序表的基本操作,c语言版的数据结构书上写的操作都实现了
因为总体代码太长如果写在一个class中要近500行,阅读和修改都不方便,所以采用分开写,希望大家以后写较长的程序时也采用这种方法,自己运行的所有功能都能实现,而且个人感觉界面还是比较人性化的,大家还有什么意见或者程序有什么问题都可以在评论区提出,我会及时修改的。
seqlist.h
#ifndef SEQLIST_H
#define SEQLIST_H
#include
#include
#define SEQLISR_INIT_SIZE 5
#define INC_SIZE 3
typedef int ElemType;
typedef struct Seqlist
{
ElemType *base;//指针域
int capacity;//顺序表容量
int size;//表的大小
}Seqlist;
void create_list(Seqlist *list);//顺序表元素的输入
bool Inc(Seqlist *list);//增加顺序表的容量
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 key);//查找元素key的下标
int length(Seqlist *list);//求顺序表的长度
void delete_pos(Seqlist *list,int pos);//删除顺序表中指定位置的数据
void delete_val(Seqlist *list,int key);//删除顺序表中值为key的元素
void sort(Seqlist *list);//冒泡排序
void reverse(Seqlist *list);//逆置顺序表
void clear(Seqlist *list);//清除顺序表中的所有元素
void destroy(Seqlist *list);//摧毁顺序表
void merge(Seqlist *lt,Seqlist *la,Seqlist *lb);//吧两个表合为一个表
#endif // SEQLIST_H
seqlist.cpp
#include "seqlist.h"
void InitSeqlist(Seqlist *list)//初始化顺序表,创建一个名字为List的线性表,list通过结构体定义
{
list->base=(ElemType*)malloc(sizeof(ElemType)*SEQLISR_INIT_SIZE);//对表list分配空间
if(!list->base)
exit(-1);
list->capacity=SEQLISR_INIT_SIZE;//顺序表的容量
list->size=0;//顺序表的大小/长度,表示当前顺序表中无任何内容
}
bool Inc(Seqlist *list)//增加顺序表的容量
{
ElemType *newbase=(ElemType*)realloc(list,sizeof(ElemType)*(list->capacity+INC_SIZE));//重新分配内存空间,增减INC个容量
if(newbase==NULL)
printf("内存分配失败!");
list->base=newbase;
list->capacity+=INC_SIZE;
}
void create_list(Seqlist *list)
{
int i,x;
printf("请确定输入元素的个数:");
scanf("%d",&i);
printf("请输入元素\n");
for(int j=0; jbase[j]=x;
}
list->size=i;
}
void push_back(Seqlist *list,ElemType x)//在顺序表的尾部插入元素
{
if(list->size>=list->capacity&&!Inc(list))
{
printf("顺序表已满,无法在尾部插入新元素");
return;
}
list->base[list->size]=x;
list->size++;
}
void push_front(Seqlist *list,ElemType x)//在顺序表头部插入新元素
{
if(list->size>=list->capacity&&!Inc(list))
{
printf("顺序表已满,无法在尾部插入新元素");
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; isize; i++)
{
printf("%d\n",list->base[i]);
}
}
void pop_front(Seqlist *list)//删除表头元素
{
if(list->size==0)
{
printf("顺序表为空,无法删除元素");
return;
}
for(int i=0; isize-1; i++)
{
list->base[i]=list->base[i+1];
}
list->size--;
}
void pop_back(Seqlist *list)//删除最后一个元素
{
if(list->size==0)
{
printf("顺序表为空,无法删除元素");
return;
}
list->size--;//这也太聪明了,直接减少一个元素
}
int length(Seqlist *list)
{
return list->size;
}
void insert_pos(Seqlist *list,int pos,ElemType x)//在指定位置插入元素
{
if(pos<0||pos>list->size)
{
printf("插入位置不合法,无法插入元素");
return;
}
if(list)
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 key)//寻找key的位置
{
for(int i=0; isize; i++)
{
if(list->base[i]==key)
return i;
}
return -1;
}
void delete_pos(Seqlist *list,int pos)//删除指定位置的元素
{
if(pos<0||pos>=list->size)
{
printf("删除位置不合法");
return;
}
for(int i=pos; isize-1; i++)
{
list->base[i]=list->base[i+1];
}
list->base--;
}
void delete_val(Seqlist *list,int key)//删除指定元素
{
int pos=find(list,key);
if(pos==-1)
{
printf("顺序表中没有这个元素");
return;
}
delete_pos(list,pos);
}
void sort(Seqlist *list)
{
for (int i = 0; i < list->size - 1; i++) //排序的趟数(例如5个数据需要比较4趟)
{
for (int j = 0; j < list->size - 1 - i; j++) //每一趟比较中的比较次数(例如5个数据在第0趟需要比较4次)
{
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 reverse(Seqlist *list)//将顺序表倒置
{
if(list->size==0||list->size==1)
return;
int low=0,high=list->size-1;
while(lowbase[low];
list->base[low]=list->base[high];
list->base[high]=temp;
low++;
high--;
}
}
void clear(Seqlist *list)
{
list->size=0;
}
void destroy(Seqlist *list)//摧毁顺序表
{
free(list->base);
list->base=NULL;
list->capacity=0;
list->size=0;
}
void merge(Seqlist *lt,Seqlist *la,Seqlist *lb)//把两个顺序表合并为一个
{
lt->capacity=la->size+lb->size;
lt->base=(ElemType*)malloc(sizeof(ElemType)*lt->capacity);
if(!lb->base)
exit(-1);
int ia=0,ib=0,ic=0;
while(iasize&&ibsize)
{
if(la->base[ia]base[ib])
{
lt->base[ic++]=la->base[ia++];
}
else
{
lt->base[ic++]=lb->base[ib++];
}
}
while(iasize)
{
lt->base[ic++]=la->base[ia++];
}
while(ibsize)
{
lt->base[ic++]=lb->base[ib++];
}
lt->size=la->size+lb->size;
show_list(lt);
}
#include "seqlist.h"
int main()
{
Seqlist list;
InitSeqlist(&list);
//create_list(&list);
ElemType item;
int pos;
int select=1;
printf("*******************************************\n");
printf("*[1] push_back [2] push_front *\n");
printf("*[3] show_list [4] pop_back *\n");
printf("*[5] pop_front [6] insert_pos *\n");
printf("*[7] find [8] length *\n");
printf("*[9] delete_pos [10] delete_value *\n");
printf("*[11] sort [12] reverse *\n");
printf("*[13] clear [14] merge *\n");
printf("*[0] quit_system *\n");
printf("*******************************************\n");
while(select)
{
printf("请选择:>>");
scanf("%d",&select);
if(select==0)
break;
switch(select)
{
case 1:
printf("请输入要插入的数据(-1结束)");
while(scanf("%d",&item),item!=-1)
{
push_back(&list,item);
}
break;
case 2:
printf("请输入要插入的数据(-1结束)");
while(scanf("%d",&item),item!=-1)
{
push_front(&list,item);
}
break;
case 3:
show_list(&list);
break;
case 4:
pop_back(&list);
break;
case 5:
pop_front(&list);
break;
case 6:
printf("请输入要插入的数据:");
scanf("%d",&item);
printf("请输入要插入的位置:");
scanf("%d",&pos);
insert_pos(&list,pos,item);
break;
case 7:
printf("请输入要查找的数据:");
scanf("%d",&item);
pos=find(&list,item);
if(pos=-1)
printf("要查找的元素不在顺序表中");
else
printf("查找元素的在顺序表中的下标位置为:%d\n",pos);
break;
case 8:
printf("顺序表的长度为%d",length(&list));
break;
case 9:
printf("请输入要删除的值的下标位置:");
scanf("%d",&pos);
delete_pos(&list,pos);
break;
case 10:
printf("请输入哟啊删除的值");
scanf("%d",&item);
delete_val(&list,item);
break;
case 11:
sort(&list);
break;
case 12:
reverse(&list);
break;
case 13:
clear(&list);
break;
case 14:
Seqlist mylist,yourlist;
ElemType item1,item2;
InitSeqlist(&mylist);
InitSeqlist(&yourlist);
printf("请输入顺序表1中的元素值");
while(scanf("%d",&item1),item1!=-1)
{
push_back(&mylist,item1);
}
printf("请输入顺序表2中的元素值");
while(scanf("%d",&item2),item2!=-1)
{
push_back(&yourlist,item2!=-1);
}
merge(&list,&mylist,&yourlist);
destroy(&mylist);
destroy(&yourlist);
break;
case 15:
create_list(&list);//顺序表的创建,输入数据
break;
default:
printf("输入的选择错误");
break;
}
}
destroy(&list);
}