文章标题
2016-12-04 21:27
351 查看
动态顺序表
顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。它的优点在于存储密度高,可以随机存储节点,缺点是插入需要移动节点,效率低。
下面为大家实现顺序表以及它的增,删,查,找,排序等功能。
首先我们需要定义一个结构体,包含一个顺序表元素类型的指针array,顺序表的容量capacity,所含元素个数size。
下面是头文件中内容:
SeqList.h
ifndef SEQLIST_H
define SEQLIST_H
include
include
include
include
define MAX_SIZE 3 //初始化后的顺序表容量
typedef int DataType;typedef struct SeqList ///定义顺序表结构体
{
DataType* array;
size_t size;
size_t capacity;
}SeqList;
void InitSeqList(SeqList* seq);////////初始化
void CheckCapacity(SeqList* seq);//////增加容量
void PushBack(SeqList* seq,DataType x);///////尾加
void PopBack(SeqList* seq);///////尾删
void DistorySeqList(SeqList* seq);/////销毁链表
void PrintSeqList(SeqList* seq);//////打印顺序表
void PushFront(SeqList* seq,DataType x);//////头插
void PopFront(SeqList* seq);///头删
int Find(SeqList* seq,DataType x);
void Insert(SeqList* seq,size_t pos,DataType x);////指定位置插入
void Erase(SeqList* seq,size_t pos);////指定位置删除
void Remove(SeqList* seq,DataType x);//////删除指定数字
void RemoveAll(SeqList* seq, DataType x);////删除所有的X
void Bubble_Sort(SeqList* seq);//冒泡排序
void Insert_Sort(SeqList* seq);//////插入排序法
void Select_sort(SeqList* seq);////////选择排序法
int Binary_Search(SeqList* seq,DataType x);/////二分查找
endif
以下是顺序表各个操作函数(文件SeqList.c):include”Seqlist.h”
void InitSeqList(SeqList* seq)////////初始化{
seq->array = (DataType*)malloc(MAX_SIZE * sizeof(DataType));/////为顺序表开辟空间 seq->size=0; seq->capacity = MAX_SIZE;
}
void CheckCapacity(SeqList* seq)////检查顺序表是否已经满了,满了则继续开辟空间
{
assert(seq);
if(seq->size == seq->capacity)
{
realloc(seq->array,sizeof(DataType)*(seq->capacity+3));
seq->capacity += 3;
}
}
void PushBack(SeqList* seq,DataType x)////从尾部添加一个元素
{
assert(seq);
CheckCapacity(seq); seq->array[seq->size]=x; seq->size++;
}
void PopBack(SeqList* seq)///////尾删
{
assert(seq);
if(seq->size==0)
{
printf(“SeqList is Enpty\n”);
return;
}
seq->array[seq->size-1]=0;
seq->size–;
}
void DistorySeqList(SeqList* seq)/////销毁顺序表
{
assert(seq);
free(seq->array);
seq->size=0;
seq->capacity=0;
}
void PrintSeqList(SeqList* seq)//////打印顺序表
{
size_t begin=0;
assert(seq);
if(seq->size==0)
{
printf(“SeqList is Enpty\n”);
return;
}
for(begin;begin<(seq->size);begin++)
{
printf(“%d “,seq->array[begin]);
}
printf(“\n”);
}
void PushFront(SeqList* seq,DataType x)//////从头部插入一个元素
{
int end = 0;
assert(seq);
end = seq->size;
CheckCapacity(seq);
while(end>0)
{
seq->array[end] = seq->array[end-1];
end–;
}
seq->array[0] = x;
seq->size++;
}
void PopFront(SeqList* seq)///头删
{
size_t begin = 0;
assert(seq);
if(seq->size==0)
{
printf(“SeqList is Enpty\n”);
return;
}
while(begin < seq->size-1)
{
seq->array[begin] = seq->array[begin+1];
begin++;
}
seq->size–;
}
int Find(SeqList* seq,DataType x)寻找x
{
int num=0;
assert(seq);
while(num < (int)seq->size)
{
if(seq->array[num] == x)
{
return num;
}
num++;
}
return -1;
}
void Insert(SeqList* seq,size_t pos,DataType x)在pos位置插入x
{
size_t num=0;
assert(seq);
assert(pos < seq->size);
CheckCapacity(seq);
num = seq->size;
while(num >pos)
{
seq->array[num] = seq->array[num-1];
num–;
}
seq->array[num] = x;
seq->size++;
}
void Erase(SeqList* seq,size_t pos)删除pos位置的数
{
assert(seq);
assert(pos < seq->size);
if(seq->size == 0)
{
printf(“SeqList is enptey\n”);
return ;
}
while(pos < (seq->size-1))
{
seq->array[pos] = seq->array[pos+1];
pos++;
}
seq->size–;
}
void Remove(SeqList* seq,DataType x)删除第一个x
{
int num = 0;
assert(seq);
num = Find(seq, x);
if(num == -1)
{
printf(“x 不存在\n”);
return ;
}
while(num < (int)seq->size-1)
{
seq->array[num] = seq->array[num+1];
num++;
}
seq->size–;
}
void RemoveAll(SeqList* seq, DataType x)/////删除所有的x
{
int count=0;
size_t num=0;
assert(seq);
if(seq->size == 0)
{
printf(“SeqList is Enpty\n”);
}
while(numsize)
{
if(seq->array[num] == x)
{
count ++;
}
else
{
seq->array[num - count] = seq->array[num];
}
num ++;
}
seq->size-=count;
}
下面是与顺序表有关的三种排序和一种查找
void Bubble_Sort(SeqList* seq)////冒泡排序
{
size_t i = 0;
size_t j = 0;
assert(seq);
while(i < seq->size-1)
{
int ret = 0;
int tmp = i;
j = i+1;
while(j < seq->size)
{
if(seq->array[tmp] > seq->array[j])
{
tmp = j;
} j++; } ret = seq->array[i]; seq->array[i] = seq->array[tmp]; seq->array[tmp] = ret; i++; }
}
void Insert_Sort(SeqList* seq)/////插入排序
{
size_t num=1;
int end=0;
assert(seq);
while(num < seq->size)
{
int ret = 0;
end = num;
ret = seq->array[end];
while((end>0)&&(retarray[end-1]))
{
seq->array[end] = seq->array[end-1];
end–;
}
seq->array[end] = ret;
num++;
}
}
void Select_sort(SeqList* seq)////选择排列
{
int right = 0;
int left = 0;
size_t i = 0, j = 0;
assert(seq);
while(i <= seq->size-1-i)
{
int ret = 0;
right = i;
left = i;
j = i+1;
while(j <= seq->size-1-i ) { if(seq->array[left] > seq->array[j]) { left =j; } if(seq->array[right] < seq->array[j]) { right = j; } j++; } if((right == i) && (left == seq->size-1-i)) { ret = seq->array[right]; seq->array[right] = seq->array[left]; seq->array[left] = ret; } else if((right == i) && (left != seq->size-1-i)) { ret = seq->array[seq->size-1-i]; seq->array[seq->size-1-i] = seq->array[right]; seq->array[right] = ret; ret = seq->array[i]; seq->array[i] = seq->array[left]; seq->array[left] = ret; } else { ret = seq->array[i]; seq->array[i] = seq->array[left]; seq->array[left] = ret; ret = seq->array[seq->size-1-i]; seq->array[seq->size-1-i] = seq->array[right]; seq->array[right] = ret; } i++; }
}
int Binary_Search(SeqList* seq,DataType x)///二分查找
{
int left=0,right = 0;
assert(seq);
right = seq->size-1;
while(left <= right)
{
int ret = left + ((right - left) >> 1);
if(x > seq->array[ret])
{
left = ret + 1;
}
else if(x < seq->array[ret])
{
right = ret - 1;
}
else
{
return ret;
}
}
return -1;
}
一下是测试函数(test.c文件)
include”Seqlist.h”
SeqList Seq ;int n = 0;
void Test1()
{
InitSeqList(&Seq);//初始化 PushBack(&Seq,9);尾插 PushBack(&Seq,8); PushBack(&Seq,7); PushBack(&Seq,6);//此时顺序表已经写满,再插入需要开辟空间 PrintSeqList(&Seq);//////打印顺序表 PopBack(&Seq);///从尾部删除一个元素 PopBack(&Seq); PopBack(&Seq); PrintSeqList(&Seq); PopBack(&Seq);////此时已经删除完 ,再删一个则显示顺序表以空 PrintSeqList(&Seq); n = Find(&Seq,8);/////查找一个元素
}
下面是测试从头部插入一个元素和冒泡排序
void Test2()
{
InitSeqList(&Seq);
PushFront(&Seq,0);
PushFront(&Seq,1);
PushFront(&Seq,2);
PushFront(&Seq,3);
PushFront(&Seq,4);
PushFront(&Seq,5);
PushFront(&Seq,6);
PushFront(&Seq,7);
PushFront(&Seq,8);
PushFront(&Seq,9);
PrintSeqList(&Seq);
Bubble_Sort(&Seq);//冒泡排序
PrintSeqList(&Seq);
}
这里小编就不一一为大家测试了,其他函数已经一一试过,大家可以放心借鉴。若大家发现问题还希望能够多多指正