1.顺序表的概念
顺序表是在计算机内存中以
数组
的形式保存的线性表,是指用一组地址连续的
存储单元
依次存储
数据元素
的线性
结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
2.实现函数功能
下面是本人利用c语言简单的实现一个动态内存管理的可以增删查改,逆序,排序等功能的顺序表。供大家参考学习。
3.代码模块
1.seqlist.h
#pragma once
#include<stdio.h>
#include <string.h>
#include <stdlib.h>
#include<assert.h>
#define MAX 10
#define DEFAULT_SZ 2
#define INC 1
typedef int DataType;
typedef struct SeqList
{
DataType *data;
int sz;
int capacity;
}SeqList, *pSeqList;
void InitSeqList(pSeqList ps);//初始化函数
void PushBack(pSeqList ps, DataType d);//头部插入函数
void PopBack(pSeqList ps);//头部删除函数
void Display(const pSeqList ps);//打印函数
void PushFront(pSeqList ps, DataType d);//尾部插入函数
void PopFront(pSeqList ps);//尾部删除函数
int Find(pSeqList ps, DataType d);//查找指定元素函数
void Insert(pSeqList ps, DataType d, int pos);//指定位置插入函数
void Remove(pSeqList ps, DataType d);//删除指定元素函数
void RemoveAll(pSeqList ps, DataType d);//删除所有指定元素函数
void Reverse(pSeqList ps);//逆序顺序表函数
void Sort(pSeqList ps);//排序顺序表函数
int BinarySearch(pSeqList ps, DataType d);//二分查找函数
void Destory_mylist(pSeqList ps);//内存销毁函数
void CheckCapacity(pSeqList ps);//检查增容函数
void DelecCapacity(pSeqList ps);//减容函数
2.实现模块
#define _CRT_SECURE_NO_WARNINGS
#include"seqlist.h"
void DelecCapacity(pSeqList ps)
{
assert(ps != NULL);
if (ps->sz < ps->capacity)
{
DataType * p = realloc(ps->data, (ps->capacity - INC)*(sizeof(DataType)));
if (p == NULL)
{
perror("use realloc");
exit(EXIT_FAILURE);
}
else
{
ps->data = p;
ps->capacity -= INC;
}
}
}
void CheckCapacity(pSeqList ps)
{
assert(ps != NULL);
if (ps->capacity == ps->sz)
{
DataType* p = realloc(ps->data, (ps->capacity + INC) *(sizeof(DataType)));
if (p == NULL)
{
perror("use realloc");
exit(EXIT_FAILURE);
}
else
{
ps->data = p;
ps->capacity += INC;
}
}
}
void Destory_mylist(pSeqList ps)
{
assert(ps != NULL);
free(ps->data);
ps->data = NULL;
ps->sz = 0;
ps->capacity = 0;
}
void InitSeqList(pSeqList ps)
{
assert(ps != NULL);
ps->sz = 0;
ps->capacity = DEFAULT_SZ;
ps->data= (DataType*)malloc(sizeof(DataType)*(ps->capacity));
if (ps->data == NULL)
{
perror("use maolloc");
exit(EXIT_FAILURE);
}
memset(ps->data, 0, sizeof(DataType)*(ps->capacity));
}
void Display(const pSeqList ps)
{
int i = 0;
for (i = 0; i < ps->sz; i++)
{
printf("%d ", ps->data[i]);
}
printf("\n");
}
void PushBack(pSeqList ps, DataType d)
{
assert(ps != NULL);
CheckCapacity(ps);
ps->data[ps->sz] = d;
ps->sz++;
}
void PopBack(pSeqList ps)
{
assert(ps != NULL);
ps->data[ps->sz] = 0;
ps->sz--;
DelecCapacity(ps);
}
void PushFront(pSeqList ps, DataType d)
{
int i = 0;
assert(ps != NULL);
CheckCapacity(ps);
if (ps->sz == MAX)
{
return;
}
memmove(ps->data + 1, ps->data, sizeof(DataType)*(ps->sz));
/*for (i = ps->sz; i > 0; i--)
{
ps->data[i] = ps->data[i-1];
}*/
ps->data[0] = d;
ps->sz++;
}
void PopFront(pSeqList ps)
{
int i = 0;
assert(ps != NULL);
memmove(ps->data, ps->data + 1, sizeof(DataType)*(ps->sz));
/*for (i = 0; i < ps->sz; i++)
{
ps->data[i] = ps->data[i + 1];
}*/
ps->sz--;
DelecCapacity(ps);
}
int Find(pSeqList ps, DataType d)
{
assert(ps != NULL);
for (int i = 0; i < ps->sz; i++)
{
if (ps->data[i] == d)
{
return i;
}
}
return -1;
}
void Insert(pSeqList ps, DataType d, int pos)
{
int i = 0;
assert(ps != NULL);
CheckCapacity(ps);
for (i = ps->sz; i > pos; i--)
{
ps->data[i] = ps->data[i - 1];
}
ps->data[pos] = d;
ps->sz++;
}
void Remove(pSeqList ps, DataType d)
{
int i = 0;
int j = 0;
assert(ps != NULL);
for (i = 0; i < ps->sz; i++)
{
if (ps->data[i] == d)
{
for (j = i; j < ps->sz; j++)
{
ps->data[j] = ps->data[j + 1];
}
}
}
ps->sz--;
DelecCapacity(ps);
}
void RemoveAll(pSeqList ps, DataType d)
{
assert(ps);
while ((Find(ps, d) != -1))
{
Remove(ps, d);
DelecCapacity(ps);
}
}
void Reverse(pSeqList ps)
{
assert(ps);
DataType * left = ps->data;
DataType * right = ps->data+ps->sz-1;
while (left < right)
{
DataType tmp=*left;
*left = *right;
*right = tmp;
*left++;
*right--;
}
}
void Sort(pSeqList ps)
{
int i = 0;
int j = 0;
assert(ps);
for (i = 0; i < ps->sz; i++)
{
for (j = 0; j < ps->sz - i - 1; j++)
{
if (ps->data[j] > ps->data[j + 1])
{
DataType tmp = ps->data[j];
ps->data[j] = ps->data[j + 1];
ps->data[j + 1] = tmp;
}
}
}
}
int BinarySearch(pSeqList ps, DataType d)
{
assert(ps);
DataType left = 0;
DataType right = ps->sz-1;
while (left < right)
{
DataType mid = left + (right - left) / 2;
if (ps->data[mid] == d)
{
return mid;
}
else if (ps->data[mid] < d)
{
left = mid+1;
}
else
{
right = mid-1;
}
}
return -1;
}
3.test.c
#define _CRT_SECURE_NO_WARNINGS
#include"seqlist.h"
void test1()//尾部插入和删除
{
SeqList 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);
}
void test2()//头部插入和删除
{
SeqList list;
InitSeqList(&list);
PushBack(&list, 1);
PushBack(&list, 2);
PushBack(&list, 3);
PushBack(&list, 4);
PushFront(&list, 5);
PopFront(&list);
Display(&list);
}
void test3()//查找和指定位置插入
{
SeqList list;
InitSeqList(&list);
PushBack(&list, 1);
PushBack(&list, 2);
PushBack(&list, 3);
PushBack(&list, 4);
int num = Find(&list, 3);
printf("%d\n", num);
Insert(&list, 5, 2);
Display(&list);
}
void test4()//删除指定元素
{
SeqList list;
InitSeqList(&list);
PushBack(&list, 1);
PushBack(&list, 2);
PushBack(&list, 2);
PushBack(&list, 4);
PushBack(&list, 4);
RemoveAll(&list, 4);
Display(&list);
}
void test5() //逆序,排序以及二分查找
{
SeqList list;
InitSeqList(&list);
PushBack(&list, 1);
PushBack(&list, 2);
PushBack(&list, 3);
PushBack(&list, 4);
PushBack(&list, 5);
PushBack(&list, 6);
Reverse(&list);
Display(&list);
Sort(&list);
Display(&list);
int num = BinarySearch(&list, 3);
printf("%d\n", num);
}
int main()
{
test5();
getchar();
return 0;
}