在数据结构中有一种存储方式是顺序表,一般表现为数组,使用一组地址连续的存储单元来依次存储数据。它的长度是固定的,在分配内存之前就已经定义了数组的长度。了解顺序表有数组的特性,就可以模拟实现一个静态顺序表。
先定义一个结构体,来存放顺序表
"Seqlist.h"
#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100
typedef int DataType;
typedef struct SeqList
{
DataType data[MAX];
int sz;
}Seq,*pSeqList;
void PrintSeqlist(pSeqList pSeq); //打印顺序表
void InitSeqList(pSeqList pSeq); //初始化
void PushBack(pSeqList pSeq,DataType x); //在后边插入一个元素
void PopBack(pSeqList pSeq); //后边删除的一个元素
void PushFront(pSeqList pSeq,DataType x); //在前边插入一个元素
void PopFront(pSeqList pSeq); //删除前面的一个元素
void Insert(pSeqList pSeq,int pos,DataType x); //指定位置插入元素
void Remove(pSeqList pSeq,DataType x); //删除一个指定的x元素
void RemoveAll(pSeqList pSeq,DataType x); //删除所有指定的x元素
void Sort(pSeqList pSeq); //排序-冒泡排序
int BinarySearch(pSeqList pSeq,DataType x); //查找某一个元素-二分查找
#endif //__SEQLIST_H__
#define _CRT_SECURE_NO_WARNINGS
#include"Seqlist.h"
void PrintSeqlist(pSeqList pSeq) //输出
{
int i = 0;
for(i=0; i<pSeq->sz; i++)
{
printf("%d ",pSeq->data[i]);
}
printf("\n");
}
void InitSeqList(pSeqList pSeq) //初始化
{
pSeq->sz=0;
memset(pSeq->data,0,sizeof(DataType)*MAX);
}
void PushBack(pSeqList pSeq,DataType x) //从后边添加
{
if(pSeq->sz == MAX)
{
printf("顺序表已满!\n");
return;
}
pSeq->data[pSeq->sz] = x;
pSeq->sz++;
}
void PopBack(pSeqList pSeq) //从后边删除
{
if(pSeq->sz == 0)
{
printf("顺序表已空!\n");
return;
}
pSeq->sz--;
}
void PushFront(pSeqList pSeq,DataType x) //从前边添加
{
int i = 0;
if(pSeq->sz == MAX)
{
printf("顺序表已满!");
}
else
{
pSeq->sz++;
}
for(i=pSeq->sz; i>0; i--)
{
pSeq->data[i] = pSeq->data[i-1];
}
pSeq->data[0] = x;
}
void PopFront(pSeqList pSeq) //从前边删除
{
int i = 0;
if(pSeq->sz == 0)
{
printf("顺序表已空!\n");
}
for(i=0; i<pSeq->sz; i++)
{
pSeq->data[i] = pSeq->data[i+1];
}
pSeq->sz--;
}
void Insert(pSeqList pSeq,int pos,DataType x) //指定位置插入
{
int i = 0;
if(pSeq->sz == MAX)
{
printf("顺序表已满!\n");
}
else
{
pSeq->sz++;
}
for(i=pSeq->sz; i>pos; i--)
{
pSeq->data[i] = pSeq->data[i-1];
}
pSeq->data[pos] = x;
}
void Remove(pSeqList pSeq,DataType x) //删除一个数据为x的元素
{
int i = 0;
int j = 0;
for(i=0; i<pSeq->sz-1; i++)
{
if(x == pSeq->data[i])
{
for(j=i; j<pSeq->sz; j++)
{
pSeq->data[j] = pSeq->data[j+1];
}
pSeq->sz--;
return;
}
}
}
void RemoveAll(pSeqList pSeq,DataType x) //删除全部数据为x的元素
{
int i = 0;
for(i=0; i<pSeq->sz; i++)
{
Remove(pSeq,x);
}
}
void Sort(pSeqList pSeq) //排序------冒泡排序
{
int i = 0;
int j = 0;
for(i=0; i<pSeq->sz-1; i++)
{
for(j=0; j<pSeq->sz-1-i; j++)
{
if(pSeq->data[j] > pSeq->data[j+1])
{
DataType temp = pSeq->data[j];
pSeq->data[j] = pSeq->data[j+1];
pSeq->data[j+1] = temp;
}
}
}
}
int BinarySearch(pSeqList pSeq,DataType x) //二分查找
{
int left = 0;
int right = pSeq->sz-1;
printf("请输入要查找的数:");
scanf("%d",&x);
while(left < right)
{
int mid = (left + right)/2;
if(x < pSeq->data[mid])
{
right = mid-1;
}
else if(x > pSeq->data[mid])
{
left = mid+1;
}
else
return mid;
}
return -1;
}
测试模块:"test.c"
#define _CRT_SECURE_NO_WARNINGS
#include"Seqlist.h"
void test_PushBack(pSeqList pSeq,DataType x) //后添
{
PushBack(pSeq,21);
PushBack(pSeq,5);
PushBack(pSeq,4);
PushBack(pSeq,12);
PushBack(pSeq,5);
PushBack(pSeq,6);
PushBack(pSeq,5);
PushBack(pSeq,7);
}
void test_PopBack(pSeqList pSeq) //后删
{
PopBack(pSeq);
PopBack(pSeq);
}
void test_PushFront(pSeqList pSeq,DataType x) //从前边添加
{
printf("请输入要添加的数:");
scanf("%d",&x);
PushFront(pSeq,x);
}
void test_PopFront(pSeqList pSeq) //从前边删除
{
PopFront(pSeq);
}
void test_Remove(pSeqList pSeq,DataType x) //删除一个x元素
{
printf("输入要删除的x元素:");
scanf("%d",&x);
Remove(pSeq,x);
}
void test_RemoveAll(pSeqList pSeq,DataType x) //删除所有x元素
{
printf("输入要删除的x元素:");
scanf("%d",&x);
RemoveAll(pSeq,x);
}
void test_Sort(pSeqList pSeq) //排序
{
Sort(pSeq) ;
}
void test_Insert(pSeqList pSeq,int pos,DataType x) //指定位置插入
{
printf("请输入要插入的数:");
scanf("%d",&x);
printf("请输入要插入的数的位置:");
scanf("%d",&pos);
Insert(pSeq,pos,x);
}
void test_BinarySearch(pSeqList pSeq,DataType x) //查找
{
int ret = 0;
printf("请输入要查找到");
ret = BinarySearch(pSeq,x);
if(ret == -1)
{
printf("不存在此数!\n");
}
else
printf("该数的下标 = %d\n",ret);
}
int main()
{
DataType x = 0;
int pos = 0;
Seq seq;
InitSeqList(&seq);
test_PushBack(&seq,x);
//test_PopBack(&seq);
//test_PushFront(&seq,x);
//test_PopFront(&seq);
//test_Insert(&seq,pos,x);
//test_Remove(&seq,x);
test_RemoveAll(&seq,x);
//test_Sort(&seq);
//test_BinarySearch(&seq,x);
PrintSeqlist(&seq);
system("pause");
return 0;
}