1. 结构封装
#include "stdio.h"
#include "malloc.h"
#define MAXSIZE 100
typedef int DataType;
typedef struct node
{
DataType data[MAXSIZE];
int length;
} SeqList, * PSeqList;
现在Seqlist已经被定义为一个复杂的数据类型,下面可以直接当做数据类型使用
PSeqList则为这种复杂数据类型的指针形式
2.顺序表的创建
/*══════════════════════════════════════╗
║创建一顺序表,入口参数无,返回一个指向顺序表的指针,指针值为零表示分配空间失败 ║
╚══════════════════════════════════════*/
/*这里只是建立一张空表,此时表中没有元素,元素的录入需要在主函数中进行插入操作*/
/*
(PSeqList)为强制类型转换,
sizeof为获取类型对象所占字节数,通常用来查看变量,数组,或结构体等所占的字节个数。
(类型 *)malloc(size)分配内存空间函数,
在内存的动态存储区域分配一块长为“size”字节的连续区域,
函数返回值为该区域的首地址,用free释放
*/
PSeqList Init_SeqList(void)
{
PSeqList PL; /*定义一个指向SeqList(线性表)类型的指针方便与实现信息的回送*/
PL = (PSeqList)malloc(sizeof(SeqList));
if (PL != NULL) /*若PL=0表示分配失败*/
PL->length = 0; /*分配成功,置长度为0*/
return (PL); /*返回的是一个指向顺序表的指针*/
}
/*当然为了可以在初始化线性表的时候,直接把录入数据的代码放入其中,这样就体现了主函数的简介性*/
//顺序表的建立:
void CreateList(SeqList *L) /*参数同 PSeqList L */
{
int i;
printf("\n L->length= ");
scanf("%d",&(L->length)); /*先输入需要输入得表数据个数*/
for(i=1;i<=L->length;i++) /*循环输入数据*/
{
printf("\n data[%d]= ",(i-1));/*格式控制*/
scanf("%d",&(L->data[i-1]));// 输入数据
}
}
3.销毁顺序表
/*══════════════════════════════════════╗
║销毁顺序表,入口参数:为要销毁的顺序表指针地址,无返回值 ║
╚══════════════════════════════════════*/
void Destroy_SeqList(PSeqList *PL)
{
if (PL && *PL) /*先判断线性表的指针和指针的地址是否为NULL*/
free(*PL); /*释放空间(先释放线性表指针的地址空间)*/
*PL = NULL; /*然后将线性表的指向置空*/
return;
}
4.顺序表的长度
/*══════════════════════════════════════╗
║求顺序表的长度,入口参数:为顺序表指针,返回表长,-1表示表不存在 ║
╚══════════════════════════════════════*/
int Length_SeqList(PSeqList PL)
{
if (PL)
return (PL->length);
return (-1);
}
5.顺序表的检索
/*══════════════════════════════════════╗
║顺序表检索,入口参数:为顺序表指针,检索元素,返回元素位置,-1表示表不存在, ║
║ 0表示查找失败 ║
╚══════════════════════════════════════*/
int Location_SeqList(PSeqList PL, DataType x)
{
int i = 0;
if(!PL)
{
printf("表不存在");
return (-1); /*表不存在,不能检索*/
}
while (i < PL->length && PL->data[i] != x)//这句好好记着
i++;
//循环结束后 i 的值为要查找的元素的下标
if (i >= PL->length) return 0;/*查找失败*/
else return (i + 1);
}
6.在顺序表的指定位置插入元素
/*══════════════════════════════════════╗
║在顺序表的第i个位置前插入x,入口参数:顺序表指针,插入位置,插入元素,返回标志 ║
║1表示成功,0表示插入位置不合法,-1表示表不存在, -2表示溢出 ║
╚══════════════════════════════════════*/
int Insert_SeqList(PSeqList PL,int i, DataType x)
{ //注意传入的i表示的意义
int j;
//i--; //操作后i为元素下标
if (!PL) {
printf("表不存在");
return(-1);
} /*表不存在,不能插入*/
if (PL->length >= MAXSIZE) {
printf("表溢出");
return(-2);
} /*表空间已满,不能插入*/
if (i<1 || i> PL->length + 1)
{ /*检查插入位置的合法性*/
printf("插入位置不合法");
return(0);
}
for (j = PL->length - 1; j >= i - 1; j--) /*这里注意j的界值与i的关系*/
PL->data[j + 1] = PL->data[j]; /* 移动元素 */
//PL->data[i] = x; //作用同下
PL->data[i - 1] = x; /*新元素插入*/
PL->length++; /*表长加 1*/
return (1); /*插入成功,返回*/
}
7.顺序表中的元素删除
/*══════════════════════════════════════╗
║顺序表删除,入口参数:顺序表指针,删除元素位置,返回标志1表示成功,0表示删除位置║
║不合法,-1表示表不存在 ║
╚══════════════════════════════════════*/
int Delete_SeqList(PSeqList PL,int i)
{
int j;
if (!PL)
{
printf("表不存在");
return(-1);
} /*表不存在,不能删除元素*/
if (i<1 || i> PL->length)
{ /*检查删除位置的合法性*/
printf("删除位置不合法");
return(0);
}
for (j = i; j < PL->length; j++)
PL->data[j - 1] = PL->data[j]; /*向上移动*/
PL->length--;
return (1); /*删除成功*/
}
8.顺序表的遍历输出
/*══════════════════════════════════════╗
║顺序表遍历输出,入口参数:顺序表指针,返回标志1表示成功,-1表示表不存在 ║
╚══════════════════════════════════════*/
int Print_SeqList(PSeqList PL)
{
int i = 0;
if (!PL)
{
printf("表不存在");
return(-1);
}
while (i < PL->length)
{
printf("%d ", PL->data[i]);
i++;
}
return(1);
}
9.主函数测试实现
int main( )
{
PSeqList PL;
int i, ret;
DataType e;
printf("▼1\n▲函数 Init_SeqList 测试...\n"); //1.函数Init_SeqList测试
{
printf("初始化顺序表 L ...\n");
PL = Init_SeqList();
printf("\n");
}
getchar(); //接受任何一个字符 执行下一个功能 作为手动分隔符
printf("▼5\n▲函数 Insert_SeqList 测试...\n"); //5.函数Insert_SeqList测试
{
for(i=1; i<=6; i++)
{
printf("作为示范,在 L 第 %d 个位置插入 \"%d\"...\n", i, 2*i);
ret = Insert_SeqList(PL, i, 2*i);
if(ret==0)
printf("插入位置不合法\n");
else if(i==-1)
printf("表不存在\n");
else if(i==-2)
printf("溢出\n");
}
printf("\n");
}
getchar();
printf("▼3\n▲函数 Length_SeqList 测试...\n"); //3.函数Length_SeqList测试
{
i = Length_SeqList(PL);
printf(" L 的长度为 %d \n", i);
}
getchar();
printf("▼3\n▲函数 Delete_SeqList 测试...\n"); //3.函数Delete_SeqList测试
{
int pos = 0;
printf("删除前:L 中的元素为:L = ");
Print_SeqList(PL);
printf("\n请输入要删除元素的位置:\n");
scanf("%d", &pos);
Delete_SeqList(PL, pos);
printf("删除后:L 中的元素为:L = ");
Print_SeqList(PL);
printf("\n\n");
}
getchar();
printf("▼4\n▲函数 Location_SeqList 测试...\n"); //4.函数Location_SeqList测试
{
printf("请输入要查找的元素:");
scanf("%d", &e);
i = Location_SeqList(PL, e);
if(i==0)
printf("查找失败\n");
else if(i==-1)
printf("表不存在\n");
else
printf(" L 中要查找的元素的位置为 %d \n", i);
printf("\n");
}
getchar();
printf("▼2\n▲函数 DestroyList_Sq 测试...\n"); //2.函数DestroyList_Sq测试
{
printf("销毁 L 前:");
Print_SeqList(PL);
Destroy_SeqList(&PL);
printf("销毁 L 后:");
Print_SeqList(PL);
printf("\n");
}
return 0 ;
}