静态顺序表(使用定长数组存储元素)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define SIZE 100
#define TRUE 1
#define FALSE 0
typedef int ElemType;
struct SeqList
{
ElemType elem[SIZE];
size_t length;
};
typedef struct SeqList SeqList;
SeqList* InitList();
int CreateList(SeqList* L, size_t n);
int ListLength(SeqList* L);
ElemType GetListElem(SeqList* L, int i);
int InsList(SeqList* L, int i, ElemType e);
int UpdList(SeqList* L, int i, ElemType e);
ElemType DelList(SeqList* L, int i);
int LocateList(SeqList* L, ElemType e);
void ClearList(SeqList* L);
int EmptyList(SeqList* L);
SeqList* InitList() {
SeqList *L;
L = (SeqList*)malloc(sizeof(SeqList));
if (L) L->length = 0;
return L;
}
int CreateList(SeqList *L, size_t n)
{
if (n >= SIZE || L->length > 0) return FALSE;
for (size_t i = 0; i < n; i++) {
scanf("%d", &L->elem[i]);
L->length++;
}
return TRUE;
}
int ListLength(SeqList *L)
{
return L->length;
}
ElemType GetListElem(SeqList* L, int i)
{
if (i > L->length) return FALSE;
return L->elem[i - 1];
}
int InsList(SeqList* L, int i, ElemType e)
{
if (i < 1 || i > L->length || L->length == SIZE) {
return FALSE;
}
for (size_t j = L->length; j >= i; j--)
L->elem[j] = L->elem[j - 1];
L->elem[i - 1] = e;
L->length++;
return TRUE;
}
int UpdList(SeqList* L, int i, ElemType e)
{
if (i < 1 || i > L->length) {
return FALSE;
}
L->elem[i - 1] = e;
return TRUE;
}
ElemType DelList(SeqList* L, int i)
{
if (i < 1 || i > L->length) {
return FALSE;
}
ElemType e = L->elem[i - 1];
for (size_t j = i; j < L->length; j++)
{
L->elem[j - 1] = L->elem[j];
}
L->length--;
return e;
}
int LocateList(SeqList* L, ElemType e)
{
for (size_t i = 0; i < L->length; i++)
{
if (L->elem[i] == e)
return i + 1;
}
return FALSE;
}
void DestroyList(SeqList* L)
{
free(L);
}
void ClearList(SeqList* L)
{
L->length = 0;
}
int EmptyList(SeqList* L)
{
return L->length > 0 ? FALSE : TRUE;
}
void ShowList(SeqList *L)
{
for (size_t i = 0; i < L->length; i++)
{
printf("%d ", L->elem[i]);
}
printf("\n");
}
int main() {
SeqList *L;
L = InitList();
int choice,n,i;
ElemType e;
while (1)
{
printf("\n********1.创建顺序表 2.插入一个元素到顺序表*********\n");
printf("********3.从顺序表删除一个元素 4.修改顺序表中元素的值*********\n");
printf("********5.查找元素首次出现的位置 6.查找顺序表中第i个元素的值****\n");
printf("********7.获取顺序表的长度 8.清空顺序表*******************\n");
printf("********9.显示顺序表的值 10.退出程序********************\n");
printf("请输入选项:");
scanf("%d", &choice);
if (choice == 10) break;
switch (choice)
{
case 1:
printf("请输入要创建的元素个数(3):");
scanf("%d", &n);
printf("请分别输入%d个元素的值(1 2 3):", n);
if (CreateList(L, n)) {
printf("顺序表创建成功!\n");
}
else {
printf("顺序表创建失败!(要创建的元素个数过多或该顺序表已经创建过)\n");
}
break;
case 2:
if (EmptyList(L)) {
printf("当前顺序表为空,请先创建!\n"); break;
}
else {
printf("请输入要插入的位置和插入的值 例如第五个位置插入1(5 1):");
scanf("%d %d", &i,&e);
if (InsList(L, i, e))
printf("插入成功!\n");
else
printf("插入失败,请检查插入的位置是否正确!\n");
break;
}
case 3:
if (EmptyList(L)) {
printf("当前顺序表为空,请先创建!\n"); break;
}
printf("请输入要删除的元素位置(2):");
scanf("%d", &i);
if (e = DelList(L, i))
printf("元素%d删除成功!\n",e);
else
printf("元素%d删除失败,查看要删除的元素位置是否正确!\n",e);
break;
case 4:
if (EmptyList(L)) {
printf("当前顺序表为空,请先创建!\n"); break;
}
printf("请输入要修改的位置和修改的值 例如第5个元素改为1(5 1):");
scanf("%d %d", &i, &e);
if (UpdList(L,i,e)) {
printf("修改成功!\n");
}
else {
printf("修改失败,请检查要修改的元素位置是否正确!\n");
}
break;
case 5:
if (EmptyList(L)) {
printf("当前顺序表为空,请先创建!\n"); break;
}
printf("请输入要查询的元素:");
scanf("%d",&e);
if (i = LocateList(L, e)) {
printf("查找成功,元素%d首次出现在第%d个位置!\n", e, i);
}
else {
printf("查找失败!元素%d不在该顺序表内!\n",e);
}
break;
case 6:
if (EmptyList(L)) {
printf("当前顺序表为空,请先创建!\n"); break;
}
printf("请输入要查询的元素位置:");
scanf("%d", &i);
if (e = GetListElem(L, i)) {
printf("查询成功,第%d个元素的值为:%d\n",i,e);
}
else {
printf("查询失败,请检查要查询的元素位置是否正确!\n");
}
break;
case 7:
printf("当前顺序表长度为:%d\n", ListLength(L));
break;
case 8:
ClearList(L);
if (EmptyList(L))
printf("顺序表清空成功!\n");
else
printf("顺序表清空失败!\n");
break;
case 9:
if (EmptyList(L)) {
printf("当前顺序表为空,请先创建!\n"); break;
}
else {
printf("当前顺序表的元素为:");
ShowList(L);
break;
}
default:
system("cls");
printf("请从新选择正确的选择!\n");
break;
}
}
}
|