实现顺序表的初始化、创建、遍历、查找、插入、删除等算法。
该程序的功能是对元素类型为整型的顺序表进行一些操作。该程序包括顺序表结构类型的定义以及对顺序表操作的具体的函数定义和主函数。
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef int status;
#define OVERFLOW 0
#define OK 1
#define ERROR 0
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
//author: 小柳学渣
typedef struct
{
ElemType*elem;
int length;
int listsize;
}SqList;
/*创建*/
status SqListInit(SqList &L)
{
L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if (!L.elem)
{
printf("申请空间失败,程序退出");
system("pause");
exit(OVERFLOW);
}
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return OK;
}
/*检查是否为空*/
status ListEmpty(SqList &L)
{
if (L.length == 0)
printf("顺序表现在为空\n");
else
printf("顺序表不为空\n");
return OK;
}
/*遍历*/
status ListTraverse(SqList &L)
{
ElemType *p;
for (p = &(L.elem[0]); p < &(L.elem[L.length]); p++)
printf("%4d", *p);
printf("\n");
return OK;
}
/*查找*/
status ListGet(SqList &L, ElemType e)
{
int i = 0;
while (i < L.length && (L.elem[i] != e))
++i;
if (i < L.length)
printf("该元素在第%d个位置\n", i + 1);
else
printf("该元素不在线性表中\n");
return OK;
}
/*插入*/
status ListInsert(SqList &L, int i, ElemType e)
{
ElemType *p, *q;
if (i<1 || i>L.length + 1)
{
printf("i值不合法\n");
return ERROR;
}
if (L.length >= L.listsize)
{
L.elem = (ElemType*)realloc(L.elem, L.listsize + LISTINCREMENT * sizeof(ElemType));
if (!L.elem)
{
exit(OVERFLOW);
system("pause");
printf("申请空间失败,程序退出");
}
L.listsize += LISTINCREMENT;
}
q = &(L.elem[i - 1]);
for (p = &(L.elem[L.length - 1]); p >= q; --p)
*(p + 1) = *p;
*q = e;
++L.length;
return OK;
}
/*删除*/
status ListDelete(SqList &L, int i)
{
ElemType *p, *q;
if (i<1 || i>L.length)
{
printf("i值不合法");
return ERROR;
}
p = &(L.elem[i - 1]);
q = L.elem + L.length - 1;
for (++p; p <= q; ++p)
*(p - 1) = *p;
--L.length;
return OK;
}
//author: 小柳学渣
int main()
{
SqList a;
SqListInit(a);
int j,k;
printf("请输入要添加元素的个数:");
scanf_s("%d", &k);
printf("请先向线性表中输入%d个数:\n",k);
for (j = 0; j < k; j++)
scanf_s("%d", &a.elem[j]);
a.length = j;
printf("************************************************\n");
printf("*顺序表操作 *\n");
printf("************************************************\n");
printf("*请选择 *\n");
printf("*1、检查顺序表是否为空 *\n");
printf("*2、遍历顺序表 *\n");
printf("*3、从顺序表中查找元素 *\n");
printf("*4、从顺序表中插入元素 *\n");
printf("*5、从顺序表中删除元素 *\n");
printf("*0、退出系统 *\n");
printf("************************************************\n");
int n = 0, e = 0, i = 0;
while (1)
{
printf("\n请输入选项");
scanf_s("%d", &n);
switch (n)
{
case 1:ListEmpty(a); break;
case 2:ListTraverse(a); break;
case 3:printf("请输入要查找的数\n");
scanf_s("%d", &e);
ListGet(a, e);
break;
case 4:printf("请输入要在第几个位置前插入什么元素\n");
scanf_s("%d%d", &i, &e);
ListInsert(a, i, e);
break;
case 5:printf("请输入要删除第几个元素\n");
scanf_s("%d", &i);
ListDelete(a, i);
break;
case 0:exit(0); break;
default:printf("没有这个选项\n"); break;
}
}
}
C中的动态分配与释放函数(malloc, realloc)