c语言顺序表的基本操作

tangzhide 2018-07-01

下面是顺序表的基本操作,c语言版的数据结构书上写的操作都实现了

因为总体代码太长如果写在一个class中要近500行,阅读和修改都不方便,所以采用分开写,希望大家以后写较长的程序时也采用这种方法,自己运行的所有功能都能实现,而且个人感觉界面还是比较人性化的,大家还有什么意见或者程序有什么问题都可以在评论区提出,我会及时修改的。

[cpp] view plain copy

seqlist.h
 
#ifndef SEQLIST_H
#define SEQLIST_H
#include <stdio.h>
#include <malloc.h>
#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("请输入元素
");
 
 for(int j=0; j<i; j++)
 {
 scanf("%d",&x);
 list->base[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; i<list->size; i++)
 {
 printf("%d
",list->base[i]);
 }
}
 
void pop_front(Seqlist *list)//删除表头元素
{
 if(list->size==0)
 {
 printf("顺序表为空,无法删除元素");
 return;
 }
 for(int i=0; i<list->size-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; i<list->size; 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; i<list->size-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(low<high)
 {
 ElemType temp=list->base[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(ia<la->size&&ib<lb->size)
 {
 if(la->base[ia]<lb->base[ib])
 {
 lt->base[ic++]=la->base[ia++];
 }
 else
 {
 lt->base[ic++]=lb->base[ib++];
 
 }
 }
 while(ia<la->size)
 {
 lt->base[ic++]=la->base[ia++];
 }
 while(ib<lb->size)
 {
 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("*******************************************
");
 printf("*[1] push_back [2] push_front *
");
 printf("*[3] show_list [4] pop_back *
");
 printf("*[5] pop_front [6] insert_pos *
");
 printf("*[7] find [8] length *
");
 printf("*[9] delete_pos [10] delete_value *
");
 printf("*[11] sort [12] reverse *
");
 printf("*[13] clear [14] merge *
");
 printf("*[0] quit_system *
");
 printf("*******************************************
");
 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
",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);
}

c语言顺序表的基本操作

相关推荐