线性表是最基本、最常用的数据结构,大部分线性表中数据元素之间的关系是一对一的关系,除了首尾元素,其它元素都是首尾相连的
其表示方法主要有顺序表示(顺序表)以及链式表示(链表),在本节介绍顺序表的一些操作实现
顺序表至少包含一个用于存储数据的数组和一个表示数据个数的变量,因此顺序表可定义为:
typedef struct {
int aiArray[ARRAY_SIZE];
int iTop;
}T_Array, *PT_Array;
顺序表的主要操作有:
1、创建一个空的顺序表:int createArray(PT_Array ptArray)
创建一个空表只需要分配一个顺序表结构体,将地址保存到一个指针中即可
2、判断顺序表是否为空:int isEmpty(PT_Array ptArray)
顺序表结构体中有一个iTop变量用于表示顺序表数据个数,当iTop = 0时,顺序表为空(数据从数组下标1的位置开始存储,便于以后实现其它算法)
3、判断顺序表是否已满:int isFull(PT_Array ptArray)
顺序表结构体中有一个iTop变量用于表示顺序表数据个数,当iTop = 数组大小 - 1时,顺序表已满
4、从顺序表中找到一个元素所在的位置:int findOneInArray(int iX, PT_Array ptArray)
从顺序表中找到一个元素的位置只需要遍历数组,比较数组元素,将对应位置返回或者作其它保存处。下面代码实现了从后往前查找第一个指定元素的功能,如果需要知道顺序表中所有该元素的位置,可以在修改函数头,添加一个指针数组,用于保存元素的位置,并且在函数体中稍作处理即可,处理方法类似后面链表章节中删除所有指定元素节点
5、将一个元素插入顺序表指定位置:int insertOneToArray(int iX, int iLoc, PT_Array ptArray)
在顺序表中插入元素,需要将插入位置后面的元素,从后往前逐一后移一位,为了防止溢出,操作前应作判满操作
6、从顺序表中删除指定位置的元素:int deleteByIndex(int iLoc, PT_Array ptArray)
在顺序表中按位置删除元素,只需要删除位置后面的元素,从前往后逐一前移一位,删除操作前应作判空操作
7、从顺序表中删除指定数据的元素:int deleteByValue(int iX, PT_Array ptArray)
在顺序表中按数据删除元素,只需要先进行查找操作,找到指定元素,再将后面的元素从前往后逐一前移一位,如果要删除所有指定数据的元素,处理方法类似后面链表章节中删除所有指定元素节点,删除操作前应作判空操作
PS:为了便于测试,添加menu函数,作为交互接口(后面各章节也一样)
附上代码(C语言)
#include <stdio.h>
#include <stdlib.h>
#include "config.h"
#ifdef DEBUG_ARRAY
#define ARRAY_SIZE 128
#define MENU_EXIT 0
#define MENU_FIND 1
#define MENU_INSERT 2
#define MENU_DELETE_BY_INDEX 3
#define MENU_DELETE_BY_VALUE 4
#define MENU_PRINT 5
typedef struct {
int aiArray[ARRAY_SIZE];
int iTop;
}T_Array, *PT_Array;
PT_Array createArray(void)
{
PT_Array ptArray;
#if 0
int i;
#endif
ptArray = (PT_Array)malloc(sizeof T_Array);
ptArray->iTop = 0;
if (!ptArray)
{
printf("Err in memory\r\n");
return NULL;
}
#if 0
printf("Enter the size of the array:");
scanf_s("%d", &ptArray->iTop);
printf("%d\r\n", ptArray->iTop);
if (ptArray->iTop > ARRAY_SIZE || ptArray->iTop <= 0)
{
printf("Err : the size of the array beyond the boundary\r\n");
return -1;
}
printf("Enter the sequence of the array, for example: 1 23 31 22\r\n");
for (i = 1; i <= ptArray->iTop; i++)
scanf_s("%d", &ptArray->aiArray[i]);
#endif
return ptArray;
}
int printArray(PT_Array ptArray)
{
int i;
if (ptArray->iTop <= 0)
{
printf("Array have no element\r\n");
return -1;
}
printf("\r\n");
for (i = 1; i <= ptArray->iTop; i++)
printf("%d ", ptArray->aiArray[i]);
printf("\r\n\r\n");
return 0;
}
int readOneElement(void)
{
int iElement;
printf("Enter one element: ");
scanf_s("%d", &iElement);
return iElement;
}
int readLoc(void)
{
int iLoc;
printf("Enter the loc: ");
scanf_s("%d", &iLoc);
return iLoc;
}
int isFull(PT_Array ptArray)
{
return ptArray->iTop == ARRAY_SIZE - 1 ? 1 : 0;
}
int isEmpty(PT_Array ptArray)
{
return ptArray->iTop <= 0 ? 1 : 0;
}
int findOneInArray(int iX, PT_Array ptArray)
{
int i;
ptArray->aiArray[0] = iX;
for(i = ptArray->iTop; i > 0; i--)
if (ptArray->aiArray[i] == iX)
{
printf("Find %d in num: %d\r\n", iX, i);
return i;
}
printf("Can't find %d\r\n", iX);
return i;
}
int insertOneToArray(int iX, int iLoc, PT_Array ptArray)
{
int i;
if (isFull(ptArray))
{
printf("Can't insert the element for the array is full\r\n");
return -1;
}
if (iLoc > ptArray->iTop + 1 || iLoc <= 0)
{
printf("Can't insert the element for the location is beyond the boundary + 1 or below 1\r\n");
return -1;
}
for (i = ptArray->iTop; i >= iLoc; i--)
ptArray->aiArray[i+1] = ptArray->aiArray[i];
ptArray->aiArray[iLoc] = iX;
ptArray->iTop++;
printf("The array after inserting: ");
printArray(ptArray);
return 0;
}
int deleteByIndex(int iLoc, PT_Array ptArray)
{
int i;
if(isEmpty(ptArray))
{
printf("Can't delete for the array is empty\r\n");
return -1;
}
if (iLoc > ptArray->iTop)
{
printf("Can't delete for the location is beyond the boundary\r\n");
return -1;
}
for (i = iLoc; i < ptArray->iTop; i++)
ptArray->aiArray[i] = ptArray->aiArray[i + 1];
ptArray->iTop--;
return 0;
}
int deleteByValue(int iX, PT_Array ptArray)
{
int iFlag = 0;
int iLoc;
iLoc = findOneInArray(iX, ptArray);
while (iLoc)
{
deleteByIndex(iLoc, ptArray);
iLoc = findOneInArray(iX, ptArray);
iFlag = 1;
}
if (iFlag == 0)
{
printf("Can't delete for the element don't exist in the array\r\n");
return -1;
}
return 0;
}
int menu(PT_Array ptArray)
{
int iNum;
int iEle, iLoc;
printf("0 to exit\r\n"
"1 to find\r\n"
"2 to insert\r\n"
"3 to delete by index\r\n"
"4 to delete by value\r\n"
"5 to print the array\r\n"
);
scanf_s("%d", &iNum);
switch (iNum)
{
case MENU_FIND:
iEle = readOneElement();
findOneInArray(iEle, ptArray);
break;
case MENU_INSERT:
iEle = readOneElement();
iLoc = readLoc();
insertOneToArray(iEle, iLoc, ptArray);
break;
case MENU_DELETE_BY_INDEX:
iLoc = readLoc();
deleteByIndex(iLoc, ptArray);
break;
case MENU_DELETE_BY_VALUE:
iEle = readOneElement();
deleteByValue(iEle, ptArray);
break;
case MENU_PRINT:
printArray(ptArray);
break;
case MENU_EXIT:
return -1;
}
return 0;
}
int main(void)
{
PT_Array ptArray;
ptArray = createArray();
if (!ptArray)
return -1;
while (1)
{
if (menu(ptArray) == -1)
break;
}
return 0;
}
#endif