顺序表:用一段地址连续存储单元依次存储数据元素的线性结构
//seqlist.h
#pragma once//防止头文件重复包含
#define MAX_SIZE 10
#include<assert.h>
#include<stdio.h>
#include<stdlib.h>
实现基于静态数组的顺序表的以下基本操作:
首先先定义一个结构体类型seqlist( arr【】,size(有效的元素个数)),
预定义一个数组的最大长度,将整型数据变量typedef为datatype,为了以后在插入删除别的类型时方便修改
- 初始化 void InitSeq(seqlist *s)
将数组的size置为0,不需要给每个元素进行赋值, - 尾插 void SeqListPushBack(seqlist *s,int data)
首先要判断是否为空数组,并且是否有空余位置插入,将数组的size+1,把元素放入最后一个位置。 - 尾删void SeqListPophBack(seqlist *s)
只需将size-1即可,也得先判断是否为空数组 - 头插 void SeqListPushFront(seqlist *s, int data)
首先要判断是否为空数组,并且是否有空余位置插入。把数组整体向后移一位(先移动最后一个元素),将第0号元素空出来,把需要插入的元素放入即可,size++。 - 头删 void SeqListPopFront(seqlist *s)
判断是否为空数组,若不是,把后边的元素整体向前移(先移动第一个元素),size--。 - 查找任意位置元素 void SeqListFind(seqlist *s, int pos)
判断是否为空数组,直接输出给定位置的元素还得判断给的位置是否超出数组最大范围 - 修改任意位置元素void UpdateData(seqlist *s, int pos, int data)
判断是否为空数组还得判断给的位置是否超出数组最大范围, 先找到这个位置元素,将其值进行修改, - 查找指定元素值的下标void SeqListFind(seqlist *s, int data)
判断是否为空数组还得判断给的位置是否超出数组最大范围,给定一个元素,遍历,判断是否与数组内的元素相等,若不相等,count++, -
在任意位置插入元素void SeqListInsert(seqlist *s, int pos,int data)
首先要判断是否为空数组,并且是否有空余位置插入还得判断给的位置是否超出数组最大范围,将(下标+1)的元素依次向后移动,再将给定元素插入给定位置,size+1;
10.在任意位置删除元素 void SeqListDelete(seqlist *s,int pos)
要判断是否为空数组,将给定位置的下一个元素向前覆盖,依次到最后一个元素,size-1。
#include"seqlist.h"
typedef int DataType;
typedef struct SeqList
{
int arr[MAX_SIZE]; // 最大元素个数
int size; //有效元素个数
}seqlist;
以上代码,就是创建一个顺序表,其中SeqList是整个顺序表的空间而size是顺序表中元素的个数。
各种函数主体:
void InitSeq(seqlist *s)//初始化静态线性表
{
assert(s);
if(s == NULL)
{
return;
}
s->size = 0;
}
void SeqListPrint(seqlist *s)//打印整个数组
{
size_t i = 0;
assert(s);
for(;i < s->size;i++)
{
printf("%d",s->arr[i]);
}
printf("\n");
}
void SeqListPopBack(seqlist *s)//尾删
{
assert(s);
if(s == NULL)
{
return;
}
s->size--;
}
void SeqListPushBack(seqlist *s,DataType data)//尾部插入
{
assert(s);
if(s == NULL)
{
return ;
}
if(s->size > MAX_SIZE)
{
return;
}
s->arr[s->size] = data;//size为有效元素个数,从0开始,相当于最后一个为空元素,所以可以直接赋值
s->size++; //指向size下一个空元素
}
void SeqListPushFront(seqlist *s,int data)//头插
{
int i = 0;
assert(s);
if(s == NULL)
{
return;
}
if(s->size>MAX_SIZE)
{
return;
}
++s->size;
for(i = s->size;i>0;i--)
{
s->arr[i] = s->arr[i - 1];
}
s->arr[0] = data;
}
void SeqListPopFront(seqlist *s)//头删
{ int i = 0;
assert(s);
if (s == NULL)
{
return;
}
for ( i = 1; i <= s->size; i++)
{
s->arr[i - 1] = s->arr[i];
}
s->size--;
}
int SeqListFind(seqlist *s,int data)//查找指定元素
{
int i = 0;
assert(s);
if(s == NULL)
{
return -1;
}
for(i=0;i<s->size;i++)
{
if(s->arr[i] == data)
{
return i;
}
}
return -2;
}
void SeqListInsert(seqlist *s,int pos,int data)//任意(pos)位置插入
{
int i = 0;
if((s == NULL)||!((pos <= s->size) && pos >= 0))
{
printf("数据越界");
return ;
}
if(10 == s->size )
{
printf("表以满");
}
s->size++;
for(i = s->size;i>pos;i--)
{
s->arr[i] = s->arr[i - 1];
}
s->arr[pos] = data;
}
void SeqListDelete(seqlist *s,int pos)//删除下标为pos的元素
{
int i = 0;
assert(s);
if(s ==NULL)
{
return;
}
for(i = pos;i<s->size;i++)
{
s->arr[i] = s->arr[i + 1];
}
s->size--;
}
void SeqListRemoveall(seqlist *s,int data)//删除所有data元素
{
int i = 0;
int count = 0;
assert(s);
for(i=0;i<s->size;i++)
{
if(s->arr[i] == data)
{
count++;
}
else
{
s->arr[i - count] = s->arr[i];//发现几个data向前移动几个
}
s->size -= count;
}
}
int BinarySearch(seqlist *s,int data)
{
int left = 0;
int right = s->size;
while(left<right)
{
int mid = left + ((right - left) >> 1);
if(data == s->arr[data])
{
return mid;
}
else if(data>mid)
{
left = mid + 1;
}
else
{
right = mid ;
}
}
return 0;
}
测试部分:
void test()
{
seqlist s;
int tmp;
InitSeq(&s);
SeqListPushBack(&s,1);
SeqListPushBack(&s,2);
SeqListPushBack(&s,3);
SeqListPushBack(&s,4);
printf("初始化,尾插后的数组: \n");
SeqListPrint(&s);
printf("/\n");
SeqListPopBack(&s);
printf("尾删后的数组:\n");
SeqListPrint(&s);
printf("/\n");
SeqListPushFront(&s,0);
printf("头插后的数组:\n");
SeqListPrint(&s);
printf("/\n");
SeqListPopFront(&s);
printf("头删后的数组: \n");
SeqListPrint(&s);
printf("\n");
tmp = SeqListFind(&s,2);
printf("arr[1]的元素位置为:%d\n",tmp);
printf("\n");
SeqListInsert(&s,0,9);
printf("任意位置插入后的数组: \n");
SeqListPrint(&s);
printf("\n");
SeqListDelete(&s,0);
printf("删除位置为0元素的数组: \n");
SeqListPrint(&s);
printf("\n");
SeqListPushBack(&s,1);
SeqListPushBack(&s,2);
SeqListPushBack(&s,1);
SeqListPushBack(&s,2);
printf("删除前数前:");
SeqListPrint(&s);
SeqListRemoveall(&s,2);
printf("删除所有data元素后: \n");
SeqListPrint(&s);
}
主函数:
int main()
{
test();
system("pause");
return 0;
}