一.头文件
#ifndef _COMMON_H_
#define _COMMON_H_
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <malloc.h>
#include <vld.h>
#pragma warning(disable :4996)
#endif
二.主函数
#include "Seqlist.h"
#pragma warning(disable :4996)
int main()
{
SeqList list;
SeqListInit(&list);
ElemType item;
int pos;
int select = 1;
bool flag;
while (select)
{
printf("***************************************\n");
printf("**** [1] push_back [2] push_front ****\n");
printf("**** [3] show_list [0] quit ****\n");
printf("**** [4] pop_back [5] pop_front ****\n");
printf("**** [6] insert_pos [7] insert_val ****\n");
printf("**** [8] erase_pos [9] erase_val ****\n");
printf("**** [10] find [11] length ****\n");
printf("**** [12] capcity [13] sort ****\n");
printf("**** [14] reverse [15] clear ****\n");
printf("***************************************\n");
printf("请选择:>");
scanf("%d", &select);
if (select == 0)
break;
switch (select)
{
case 1:
printf("请输入你要插入的数字<以-1结束>:");
while (scanf("%d", &item), item != -1)
{
SeqListPush_back(&list, item);
}
printf("头部插入成功......\n");
break;
case 2:
printf("请输入你要插入的数字<以-1结束>:");
while (scanf("%d", &item), item != -1)
{
SeqListPush_front(&list, item);
}
printf("尾部插入成功......\n");
break;
case 3:
show_list(&list);
break;
case 4:
SeqListPop_back(&list);
printf("尾部删除成功......\n");
break;
case 5:
SeqListPopFront(&list);
printf("头部删除成功......\n");
break;
case 6:
printf("请输入要插入的位置:>");
scanf("%d", &pos);
printf("清输入要插入的数字:>");
scanf("%d", &item);
flag = SeqListInsertByPos(&list, pos, item);
if (flag)
printf("插入数据成功......\n");
else
printf("插入数据失败......\n");
break;
case 7:
printf("请输入需要插入的数字:>");
scanf("%d", &item);
SeqListSort(&list);
flag = SeqListInsertByVal(&list, item);
if (flag)
printf("任意位置的插入成功......\n");
else
printf("任意位置的插入失败......\n");
break;
case 8:
printf("请输入你要删除的位置:>");
scanf("%d", &pos);
flag = SeqListEraseByPos(&list, pos);
if (flag)
printf("删除自定位置元素成功......\n");
else
printf("删除自定位置元素失败......\n");
break;
case 9:
printf("请输入要删除的元素:>");
scanf("%d", &item);
flag = SeqListEraseVal(&list, item);
if (flag)
printf("删除指定元素成功......\n");
else
printf("删除指定元素失败......\n");
break;
case 10:
printf("请输入要查找的数字:>");
scanf("%d", &item);
flag = SeqListFind(&list, item);
if (flag)
printf("查找成功.....\n");
else
printf("查找失败.....\n");
break;
case 11:
printf("Seqlist length = %d\n", SeqListLength(&list));
break;
case 12:
printf("SeqList capacity = %d\n",SeqListCapacity(&list));
break;
case 13:
SeqListSort(&list);
printf("顺序表排序成功.....\n");
break;
case 15:
SeqListClear(&list);
break;
default :
printf("输入错误,请重新出入......\n");
break;
}
system("pause");
system("cls");
}
SeqlistDestory(&list);
return 0;
}
三.函数具体实现
#ifndef _SEQLIST_H_
#define _SEQLIST_H_
#include "Common.h"
#define ElemType int
#define SEQLIST_DEFAULT_SIZE 8
typedef struct SeqList
{
ElemType *base;
size_t capacity;
size_t size;
}SeqList;
void SeqListInit(SeqList *plist);
void SeqlistDestory(SeqList *plist);
void SeqListPush_back(SeqList *plist, ElemType x);
void SeqListPush_front(SeqList *plist, ElemType x);
void show_list(SeqList *plist);
size_t SeqListLength(SeqList *plist);
void SeqListPop_back(SeqList *plist);
void SeqListClear(SeqList *plist);
bool SeqListInsertByPos(SeqList*plist, int pos, ElemType x);
void SeqListSort(SeqList* plist);
size_t SeqListCapacity(SeqList *plist);
void SeqListPopFront(SeqList* plist);
bool SeqListInsertByVal(SeqList* plist, ElemType x);
bool SeqListEraseByPos(SeqList* plist, int pos);
bool SeqListEraseVal(SeqList* plist, ElemType x);
bool SeqListFind(SeqList* plist,ElemType x);
bool ISFull(SeqList* plist)
{
assert(plist != NULL);
return plist->size >= plist->capacity;
}
bool ISEmpty(SeqList* plist)
{
assert(plist != NULL);
return plist->size == 0;
}
void SeqListInit(SeqList *plist)
{
plist->capacity = SEQLIST_DEFAULT_SIZE;
plist->base = (ElemType*)malloc(sizeof(ElemType)*plist->capacity);
plist->size = 0;
}
void SeqListPush_back(SeqList *plist, ElemType x)
{
assert(plist != NULL);
if (ISFull(plist))
{
printf("顺序表已满,%d 不能尾部插入\n", x);
}
plist->base[plist->size++] = x;
}
void SeqListPush_front(SeqList *plist, ElemType x)
{
assert(plist != NULL);
if (ISFull(plist))
{
printf("顺序表已满,%d 不能头部插入\n", x);
}
for (int i = plist->size; i > 0; --i)
{
plist->base[i] = plist->base[i - 1];
}
plist->base[0] = x;
plist->size++;
}
void show_list(SeqList *plist)
{
assert(plist != NULL);
for (int i = 0; i < plist->size; ++i)
printf("%d ", plist->base[i]);
printf("\n");
}
void SeqlistDestory(SeqList *plist)
{
assert(plist != NULL);
free(plist->base);
plist->base = NULL;
plist->capacity = plist->size = 0;
}
size_t SeqListLength(SeqList *plist)
{
assert(plist != NULL);
return plist->size;
}
void SeqListPop_back(SeqList *plist)
{
assert(plist != NULL);
if (ISEmpty(plist))
{
printf("顺序表为空,不能尾部删除\n");
}
plist->size--;
}
void SeqListClear(SeqList *plist)
{
assert(plist != NULL);
plist->size = 0;
}
bool SeqListInsertByPos(SeqList*plist, int pos, ElemType x)
{
assert(plist != NULL);
if (ISFull(plist))
{
printf("顺序表已满,% 的不能插入在 %d 的位置", x, pos);
return false;
}
if (pos < 0 || pos >plist->size)
{
printf("要插入的位置[%d]非法,%d 不能插入\n", pos, x);
}
for (int i = plist->size; i < pos; --i)
plist->base[i] = plist->base[i - 1];
plist->base[pos] = x;
plist->size ++;
return true;
}
void SeqListSort(SeqList* plist)
{
for (size_t i = 0; i < plist->size; ++i)
{
for (size_t j = i + 1; j < plist->size; ++j)
{
if (plist->base[i] > plist->base[j])
{
int temp = plist->base[i];
plist->base[i] = plist->base[j];
plist->base[j] = temp;
}
}
}
}
size_t SeqListCapacity(SeqList *plist)
{
assert(plist != NULL);
return plist->capacity;
}
void SeqListPopFront(SeqList* plist)
{
assert(plist != NULL);
assert(!ISEmpty(plist));
for (size_t i = 0; i < plist->size; ++i)
plist->base[i] = plist->base[i + 1];
plist->size--;
}
bool SeqListInsertByVal(SeqList* plist, ElemType x)
{
assert(plist != NULL);
if (ISFull(plist))
{
printf("顺序表已满,%d 不能插入......\n");
return false;
}
#if 0
size_t pos = 0;
while (pos < plist->size && x > plist->base[pos])
pos++;
for (size_t i = plist->size; i > pos; --i)
plist->base[i] = plist->base[i - 1];
plist->base[pos] = x;
plist->size++;
#endif
size_t end = plist->size - 1;
while (end >= 0 && x < plist->base[end])
{
plist->base[end + 1] = plist->base[end];
end--;
}
plist->base[end + 1] = x;
plist->size++;
}
bool SeqListEraseByPos(SeqList* plist, int pos)
{
assert(plist != NULL);
if (ISFull(plist))
{
printf("顺序表已满,不能插入......\n");
return false;
}
for (size_t i = pos; i < plist->size; ++i)
plist->base[i] = plist->base[i + 1];
plist->size--;
}
bool SeqListEraseVal(SeqList* plist, ElemType x)
{
assert(plist != NULL);
if (ISEmpty(plist))
{
printf("顺序表为空,不能删除......\n");
return false;
}
size_t pos = 0;
while (pos < plist->size && plist->base[pos] != x)
pos++;
for (size_t i = pos; i < plist->size; ++i)
plist->base[i] = plist->base[i + 1];
plist->size--;
}
bool SeqListFind(SeqList* plist, ElemType x)
{
assert(plist != NULL);
for (size_t i = 0; i < plist->size; ++i)
{
if (plist->base[i] == x)
{
printf("%d 已找到......\n",x);
return true;
}
}
return false;
}
#endif