(1)概念及结构
顺序表是用一段物理地址连续的储存单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
顺序表一般可以分为:
1) 静态顺序表:使用定长数组储存。
2)动态顺序表:使用动态开辟的数组储存。
以下内容根据动态顺序表编写:
(2)创建3个文件
1)头文件
首先是创建SeqList.h头文件,清楚我们要编写哪些模块,然后将每个函数在头文件里声明一下。分别是:初始化顺序表、打印顺序表、检查容量、尾插数据、头插数据、尾删数据、头删数据、在任意位置插入数据、删除任意位置的数据、释放内存、查找数据、修改任意位置的数据。
#pragma once
#ifndef __SEQLIST__H__
#define __SEQLIST__H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
typedef int SQDataType;
typedef struct SeqList {
SQDataType* a;
int size;
int capacity;
}SL;
void SeqListInit(SL* ps);
void SeqListPrint(SL* ps);
void SeqListCheckCapacity(SL* ps);
void SeqListPushBack(SL* ps, SQDataType x);
void SeqListPushFront(SL* ps,SQDataType x);
void SeqListPopBack(SL* ps);
void SeqListPopFront(SL* ps);
void SeqListInsert(SL* ps,int pos,SQDataType x);
void SeqListErease(SL* ps,int pos);
void SeqListDestory(SL*ps);
int SeqListFind(SL* ps,SQDataType x);
void SeqListModity(SL* ps,int pos,SQDataType x);
#endif
2)创建函数文件和测试文件
创建SeqList.c函数文件和test.c测试文件,在这两个文件中分别都要包含"SeqList.h"头文件。也就是写入#include "SeqList.h"。
(3)函数文件各模块功能的代码实现
1)初始化顺序表
void SeqListInit(SL* ps)
{
ps->a = NULL;
ps->size = 0;
ps->capacity = 0;
}
2)打印顺序表中的数据
void SeqListPrint(SL* ps)
{
assert(ps!=NULL);
int i = 0;
for (i=0;i<ps->size;i++)
{
printf("%d ",ps->a[i]);
}
printf("\n");
}
3)检查顺序表的容量,不够就扩容。
void SeqListCheckCapacity(SL* ps)
{
assert(ps!=NULL);
if (ps->size >= ps->capacity)
{
int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
SQDataType* tmp = (SQDataType*)realloc(ps->a, sizeof(SQDataType) * newcapacity);
if (tmp == NULL)
{
printf("realloc,fail!\n");
return(-1);
}
else
{
ps->a = tmp;
ps->capacity = newcapacity;
}
}
}
4)实现尾插,先扩容,因为初始化之后容量为0。
void SeqListPushBack(SL* ps, SQDataType x)
{
assert(ps!=NULL);
SeqListCheckCapacity(ps);
ps->a[ps->size] = x;
ps->size++;
}
5)实现头插
void SeqListPushFront(SL* ps, SQDataType x)
{
assert(ps);
SeqListCheckCapacity(ps);
int end = ps->size - 1;
while (end>=0)
{
ps->a[end + 1] = ps->a[end];
end--;
}
ps->a[0] = x;
ps->size++;
}
6)实现尾删
void SeqListPopBack(SL* ps)
{
assert(ps->size>0);
ps->size--;
}
7)实现头删
void SeqListPopFront(SL* ps)
{
assert(ps->size > 0);
int start = 1;
while (start<ps->size)
{
ps->a[start - 1] = ps->a[start];
start++;
}
ps->size--;
}
8)在指定位置插入数据
void SeqListInsert(SL* ps, int pos, SQDataType x)
{
assert(pos < ps->size);
SeqListCheckCapacity(ps);
int end = ps->size;
while (end>=pos)
{
ps->a[end] = ps->a[end-1];
end--;
}
ps->size++;
ps->a[pos-1] = x;
}
9)删除指定位置的数据
void SeqListErease(SL* ps, int pos)
{
assert(pos < ps->size);
int start = pos-1;
while (start<ps->size)
{
ps->a[start] = ps->a[start + 1];
start++;
}
ps->size--;
}
10)释放内存
void SeqListDestory(SL* ps)
{
assert(ps!=NULL);
free(ps);
ps->a = NULL;
ps->size = 0;
ps->capacity = 0;
}
11)查找数据
int SeqListFind(SL* ps, SQDataType x)
{
assert(ps);
int i = 0;
for (i = 0; i < ps->size; i++)
{
if (ps->a[i] == x)
{
return i;
}
}
return -1;
}
11)修改指定位置的数据
void SeqListModity(SL* ps,int pos, SQDataType x)
{
assert(pos<ps->size);
ps->a[pos] = x;
}
(4)测试文件的代码
#include"SeqList.h"
//测试函数
//int main()
//{
// SL s1;
// SeqListInit(&s1);
// SeqListPushBack(&s1,1);
// SeqListPushBack(&s1,2);
// SeqListPushBack(&s1,3);
// SeqListPrint(&s1);
// SeqListPushFront(&s1, 9);
// SeqListPushFront(&s1, 8);
// SeqListPrint(&s1);
// SeqListPopBack(&s1);
// SeqListPrint(&s1);
// SeqListPopFront(&s1);
// SeqListPrint(&s1);
// SeqListInsert(&s1, 2,6);
// SeqListInsert(&s1, 3, 10);
// SeqListInsert(&s1, 4, 9);
// SeqListInsert(&s1, 3, 8);
// SeqListInsert(&s1, 5, 1);
// SeqListPrint(&s1);
// SeqListErease(&s1,4);
// SeqListPrint(&s1);
// SeqListErease(&s1, 1);
// SeqListPrint(&s1);
// int i=SeqListFind(&s1, 1);
// printf("%d\n",i);
// SeqListModity(&s1,1,0);
// SeqListPrint(&s1);
//}
void meau()
{
printf("**********************************\n");
printf("****1.打印数据, 2.尾插数据********\n");
printf("****3.头插数据, 4.尾删数据********\n");
printf("****5.头删数据, 6.任意位置插入数据\n");
printf("****7.删除任意位置数据,8.查找数据********\n");
printf("****9.修改数据, -1.退出***********\n");
printf("请输入你要选择的选项\n");
}
void main()
{
SL s;
SeqListInit(&s);
int option=0;
int x=0;
int pos = 0;
while (option != -1)
{
meau();
scanf("%d",&option);
switch (option)
{
case 1:
SeqListPrint(&s);
break;
case 2:
printf("请输入你要尾插的数据,以-1结束\n");
do
{
scanf("%d", &x);
if (x != -1)
{
SeqListPushBack(&s, x);
}
} while (x != -1);
SeqListPrint(&s);
break;
case 3:
printf("请输入你要头插的数据,以-1结束\n");
do
{
scanf("%d",&x);
if (x != -1)
{
SeqListPushFront(&s, x);
}
} while (x != -1);
SeqListPrint(&s);
break;
case 4:
SeqListPopBack(&s);
SeqListPrint(&s);
break;
case 5:
SeqListPopFront(&s);
SeqListPrint(&s);
break;
case 6:
printf("请输入你要插入数据的位置和数据\n");
scanf("%d %d",&pos,&x);
SeqListInsert(&s, pos, x);
SeqListPrint(&s);
break;
case 7:
printf("请输入你要删除数据的位置\n");
scanf("%d",&pos);
SeqListErease(&s,pos);
SeqListPrint(&s);
break;
case 8:
printf("请输入你要查找的数据\n");
scanf("%d",&x);
int i=SeqListFind(&s,x);
if (i != -1)
{
printf("查找到%位于数组的第%d位",x,i+1);
}
else
{
printf("找不到\n");
}
break;
case 9:
printf("请输入你要修改的数据的位置,和修改后的内容\n");
scanf("%d %d",&pos,&x);
SeqListModity(&s,pos,x);
SeqListPrint(&s);
break;
default:
break;
}
}
SeqListDestory(&s);
}