动态定长顺序表的基本操作
ElemType* SeqListInit();
int SeqListDestory(SeqList* L);
void CheckCapacity(SeqList* L);
int SeqListPushBack(SeqList* L, ElemType x);
int SeqListPopBack(SeqList* L);
int SeqListPushFront(SeqList* L, ElemType x);
int SeqListPopFront(SeqList* L);
int SeqListPrint(SeqList* L);
int SeqListFind(SeqList* L, ElemType x);
int SeqListInsert(SeqList* L, size_t i, ElemType x);
int SeqListErase(SeqList* L, size_t i);
size_t SeqListSize(SeqList* L);
int SeqListAt(SeqList* L, size_t i, ElemType x);
完整代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef struct SeqList
{
ElemType* arr;
size_t size;
size_t capacity;
}SeqList;
int SeqListDestory(SeqList* L);
void CheckCapacity(SeqList* L);
int SeqListPushBack(SeqList* L, ElemType x);
int SeqListPopBack(SeqList* L);
int SeqListPushFront(SeqList* L, ElemType x);
int SeqListPopFront(SeqList* L);
int SeqListPrint(SeqList* L);
int SeqListFind(SeqList* L, ElemType x);
int SeqListInsert(SeqList* L, size_t i, ElemType x);
int SeqListErase(SeqList* L, size_t i);
size_t SeqListSize(SeqList* L);
int SeqListAt(SeqList* L, size_t i, ElemType x);
SeqList* SeqListInit()
{
SeqList* L;
L = (SeqList*)malloc(sizeof(SeqList));
L->arr = NULL;
L->size = 0;
L->capacity = 0;
return L;
}
int SeqListDestory(SeqList* L)
{
assert(L != NULL);
free(L->arr);
L->arr = NULL;
L->size = 0;
L->capacity = 0;
return 1;
}
void CheckCapacity(SeqList* L)
{
assert(L != NULL);
if(L->size == L->capacity){
size_t newcapacity;
if (L->capacity == 0)
newcapacity = L->capacity = 4;
else
newcapacity = L->capacity * 2;
ElemType* p = (ElemType*)realloc(L->arr, newcapacity * sizeof(ElemType));
if (p == NULL) {
perror("realloc");
exit(-1);
}
else {
L->arr = p;
L->capacity = newcapacity;
}
}
}
int SeqListPushBack(SeqList* L, ElemType x) {
assert(L != NULL);
CheckCapacity(L);
L->arr[L->size] = x;
L->size++;
return 1;
}
int SeqListPopBack(SeqList* L) {
assert(L != NULL);
assert(L->size > 0);
L->size--;
return 1;
}
int SeqListPushFront(SeqList* L, ElemType x) {
assert(L != NULL);
CheckCapacity(L);
for (size_t i = L->size; i > 0; i--)
{
L->arr[i] = L->arr[i - 1];
}
L->arr[0] = x;
L->size++;
return 1;
}
int SeqListPopFront(SeqList* L) {
assert(L != NULL);
assert(L->size > 0);
for (size_t i = 0; i < L->size; i++)
{
L->arr[i] = L->arr[i + 1];
}
L->size--;
return 1;
}
int SeqListPrint(SeqList* L) {
assert(L != NULL);
if (L->size == 0) return 0;
for (size_t i = 0; i < L->size; i++)
{
printf("%d ", L->arr[i]);
}
return 1;
}
int SeqListFind(SeqList* L, ElemType x) {
assert(L != NULL);
for (int i = 0; i < L->size; i++)
{
if (L->arr[i] == x) {
return i;
}
}
return -1;
}
int SeqListInsert(SeqList* L, size_t i, ElemType x) {
assert(L != NULL);
assert(i >= 0 && i<=L->size);
CheckCapacity(L);
for (size_t j = L->size; j > i; j--)
{
L->arr[j] = L->arr[j - 1];
}
L->arr[i] = x;
L->size++;
return 1;
}
int SeqListErase(SeqList* L, size_t i) {
assert(L != NULL);
assert(L->size > 0);
assert(i >= 0 && i < L->size);
for (size_t j = i; j < L->size; j++)
{
L->arr[j] = L->arr[j + 1];
}
L->size--;
return 1;
}
size_t SeqListSize(SeqList* L) {
assert(L != NULL);
return L->size;
}
int SeqListAt(SeqList* L, size_t i, ElemType x) {
assert(L != NULL);
assert(L->size > 0);
assert(i >= 0 && i <= L->size);
L->arr[i] = x;
return 1;
}
int main() {
int n,x,i;
SeqList* L;
L = SeqListInit();
while (1) {
printf("----------------------------------------------------------------------------------------\n");
printf("********1.显示顺序表的值 2.插入一个元素到顺序表的尾部***\n");
printf("********3.插入一个元素到顺序表的头部 4.从顺序表的尾部删除一个元素***\n");
printf("********5.从顺序表的头部删除一个元素 6.查找元素x在顺序表中的位置****\n");
printf("********7.在顺序表指定的位置插入元素 8.删除(释放)顺序表***********\n");
printf("********9.在顺序表中删除指定下标位置的数据 10.修改指定下标位置的数据******\n");
printf("********11.返回顺序表的元素个数 12.退出程序********************\n");
printf("请输入选项:");
scanf("%d", &n);
if (n == 15) break;
switch (n)
{
case 1:
if (SeqListPrint(L))
printf("\n顺序表的值打印成功!\n");
else
printf("\n顺序表的值打印失败!\n");
break;
case 2:
printf("请输入要插入的元素:");
scanf("%d", &x);
if (SeqListPushBack(L, x))
printf("元素%d插入成功!\n",x);
else
printf("元素%d插入失败!\n",x);
break;
case 3:
printf("请输入要插入的元素:");
scanf("%d", &x);
if (SeqListPushFront(L,x))
printf("元素%d插入成功!\n", x);
else
printf("元素%d插入失败!\n", x);
break;
case 4:
if (SeqListPopBack(L))
printf("成功从尾部删除一个元素!\n");
else
printf("从尾部删除一个元素失败!\n");
break;
case 5:
if (SeqListPopFront(L))
printf("成功从头部删除一个元素!\n");
else
printf("从头部删除一个元素失败!\n");
break;
case 6:
printf("请输入要查找的元素:");
scanf("%d", &x);
if ((i = SeqListFind(L, x)) != -1)
printf("元素%d在顺序表中的下标是%d\n", x,i);
else
printf("元素%d不在顺序表中\n",x);
break;
case 7:
printf("请输入要插入的位置和插入的值(1 2):");
scanf("%d %d", &i, &x);
if (SeqListInsert(L, i, x))
printf("元素%d插入位置%d成功\n",x,i);
else
printf("元素%d插入位置%d失败\n", x, i);
break;
case 8:
if(SeqListDestory(L))
printf("释放顺序表成功!\n");
else
printf("顺序表释放失败!\n");
break;
case 9:
printf("请输入要删除元素的位置:");
scanf("%d", &i);
if (SeqListErase(L, i))
printf("位置%d的元素删除成功!\n",i);
else
printf("位置%d的元素删除失败!\n",i);
break;
case 10:
printf("请输入要修改的位置和修改的值(1 2):");
scanf("%d %d", &i, &x);
if (SeqListAt(L, i, x))
printf("位置%d的元素成功修改为%d\n", i, x);
else
printf("修改失败\n");
break;
case 11:
printf("顺序表的元素个数为%d个\n", SeqListSize(L));
break;
default:
break;
}
}
return 0;
}