一、顺序表
顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
二、顺序表代码
Seqlist.h //头文件
#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
#define MAX 10
typedef int Datatype;
typedef struct Seqlist
{
Datatype data[MAX];
int sz;
}Seq, *p;
void InitSeqlist(p ps); //初始化
void PushBack(p ps, Datatype d); //尾插函数
void PopBack(p ps); //尾删函数
void Display(const p ps); //显示函数
void PushFront(p ps, Datatype d); //头插函数
void PopFront(p ps); //头删函数
int Find(p ps, Datatype d); //查找函数
void Insert(p ps, Datatype d, int pos); //指定位置插入
void Remove(p ps, Datatype d); //删除第一个出现的d
void RemoveAll(p ps, Datatype d); //删除所有d
void Reverse(p ps); //翻转
void Sort(p ps); //排序
int BinarySearch(p ps, Datatype d); //二分查找
#endif //__SEQLIST_H__
seqlist.c 函数定义
#include"Seqlist.h"
void InitSeqlist(p ps) //初始化
{
ps->sz = 0;
memset(ps->data, 0, sizeof(Datatype)*(ps->sz));
}
void PushBack(p ps, Datatype d) //尾插函数
{
assert(ps);
if (ps->sz == MAX)
return;
ps->data[ps->sz] = d;
ps->sz++;
}
void PopBack(p ps) //尾删函数
{
assert(ps);
if (ps->sz != 0)
{
ps->sz--;
}
else
return;
}
void PushFront(p ps, Datatype d) //头插函数
{
int i = 0;
assert(ps);
if (ps->sz == MAX)
{
return;
}
for (i = ps->sz; i>0; i--)
{
ps->data[i] = ps->data[i - 1];
}
ps->data[0] = d;
ps->sz++;
}
void PopFront(p ps) //头删函数
{
assert(ps);
int i = 0;
for (i = 0; i < ps->sz-1; i++)
{
ps->data[i] = ps->data[i + 1];
}
ps->sz--;
}
int Find(p ps, Datatype d) //查找函数
{
int i = 0;
assert(ps);
if (ps->sz == 0)
return -1;
while (i<ps->sz)
{
if (ps->data[i] == d)
return i;
i++;
}
return -1;
}
void Insert(p ps, Datatype d, int pos) //指定位置插入函数
{
assert(ps);
if (ps->sz == MAX)
return;
int i = 0;
for (i =ps->sz; i>=pos; i--)
{
ps->data[i] = ps->data[i - 1];
}
ps->data[pos - 1] = d;
ps->sz++;
}
void Remove(p ps, Datatype d) //删除第一个出现的d
{
assert(ps);
if (ps->sz == 0)
return;
int ret=Find(ps, d);
if (ret == -1)
{
return;
}
else
{
int i = 0;
for (i = ret; i < ps->sz-1; i++)
ps->data[i] = ps->data[i + 1];
ps->sz--;
}
}
void RemoveAll(p ps, Datatype d) //删除所有d
{
int i = 0;
assert(ps);
if (ps->sz == 0)
return;
while (1)
{
int ret = Find(ps, d);
if (ret == -1)
{
return;
}
else
{
Remove(ps, d);
}
}
}
void Reverse(p ps) //翻转
{
assert(ps);
int left = 0;
int right = ps->sz-1;
while (left < right)
{
Datatype ret = ps->data[left];
ps->data[left] = ps->data[right];
ps->data[right] = ret;
left++;
right--;
}
}
void Sort(p ps) //排序
{
int i = 0, j = 0;
assert(ps);
for (i = 0; i < (ps->sz - 1);i++)
for (j = 0; j < (ps->sz - 1 - i); j++)
{
if (ps->data[j]>ps->data[j + 1])
{
int tmp = ps->data[j];
ps->data[j] = ps->data[j + 1];
ps->data[j + 1] = tmp;
}
}
}
int BinarySearch(p ps, Datatype d) //二分查找
{
int left = 0;
int right = ps->sz-1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (ps->data[mid] > d)
right = mid - 1;
else if (ps->data[mid] < d)
left = mid + 1;
else
return mid;
}
return -1;
}
void Display(const p ps) //显示函数
{
int i = 0;
for (i = 0; i < ps->sz; i++)
printf("%d ", ps->data[i]);
printf("\n");
}
test.c 测试函数
#include"Seqlist.h"
void test1()
{
Seq list;
InitSeqlist(&list);
PushBack(&list, 1);
PushBack(&list, 2);
PushBack(&list, 3);
PushBack(&list, 4);
Display(&list);
PopBack(&list);
Display(&list);
PopBack(&list);
Display(&list);
PopBack(&list);
Display(&list);
PopBack(&list);
Display(&list);
PopBack(&list);
Display(&list);
}
void test2()
{
Seq list;
InitSeqlist(&list);
PushFront(&list, 1);
PushFront(&list, 2);
PushFront(&list, 3);
PushFront(&list, 4);
Display(&list);
PopFront(&list);
Display(&list);
PopFront(&list);
Display(&list);
PopFront(&list);
Display(&list);
PopFront(&list);
Display(&list);
PopFront(&list);
Display(&list);
}
void test3()
{
Seq list;
InitSeqlist(&list);
PushBack(&list, 1);
PushBack(&list, 2);
PushBack(&list, 3);
PushBack(&list, 4);
PushBack(&list, 5);
Display(&list);
Insert(&list, 6, 2);
Display(&list);
}
test4()
{
Seq list;
InitSeqlist(&list);
PushBack(&list, 1);
PushBack(&list, 2);
PushBack(&list, 3);
PushBack(&list, 4);
PushBack(&list, 5);
Display(&list);
Remove(&list, 3);
Display(&list);
Remove(&list, 1);
Display(&list);
Remove(&list, 5);
Display(&list);
}
test5()
{
Seq list;
InitSeqlist(&list);
PushBack(&list, 1);
PushBack(&list, 4);
PushBack(&list, 3);
PushBack(&list, 4);
PushBack(&list, 5);
PushBack(&list, 4);
PushBack(&list, 5);
PushBack(&list, 4);
PushBack(&list, 5);
Display(&list);
RemoveAll(&list, 4);
Display(&list);
}
test6()
{
Seq list;
InitSeqlist(&list);
PushBack(&list, 9);
PushBack(&list, 8);
PushBack(&list, 6);
PushBack(&list, 7);
PushBack(&list, 5);
PushBack(&list, 3);
PushBack(&list, 4);
PushBack(&list, 2);
PushBack(&list, 1);
Display(&list);
Sort(&list);
Display(&list);
int tmp=BinarySearch(&list,6);
printf("%d\n", tmp);
}
void test7()
{
Seq list;
InitSeqlist(&list);
PushBack(&list, 9);
PushBack(&list, 8);
PushBack(&list, 6);
PushBack(&list, 7);
PushBack(&list, 5);
PushBack(&list, 3);
PushBack(&list, 4);
PushBack(&list, 2);
PushBack(&list, 1);
Display(&list);
Sort(&list);
Display(&list);
Reverse(&list);
Display(&list);
}
int main()
{
//test1(); //尾插,尾删
//test2(); //头插,头删
//test3(); //指定位置插入
//test4(); //删除第一个出现的查找的数
//test5(); //删除所有指定的数
//test6(); //排序,二分查找
test7(); //数组翻转
system("pause");
return 0;
}