删除算法的思路:
- 如果删除位置不合理,抛出异常;
- 取出删除元素;
- 从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置;
- 表长减1。
int ListDelete(SqList* L,int i,ElemType* e)
{
int k = 0;
if (L->iLength == 0)
{
return ERROR;
}
if(i<0 || i>L->iLength)
{
return ERROR;
}
*e = L->iData[i-1];
for (k = i;k<L->iLength;k++)
{
L->iData[k-1] = L->iData[k];
}
L->iLength--;
return OK;
}
下面是顺序表对应的完整实例:
#include <iostream>
#include <time.h>
using namespace std;
#define MAX_SIZE 20
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef struct
{
ElemType iData[MAX_SIZE];
int iLength;
}SqList;
//顺序表初始化
int InitList(SqList* L)
{
L->iLength = 0;
return OK;
}
//顺序表建立
SqList CreateList(SqList L)
{
int i = 0;
srand((unsigned)time(NULL));
for (i=0; i<10; i++)
{
L.iData[i] = rand()%100;
L.iLength++;
}
return L;
}
int visit(ElemType c)
{
printf("%d ",c);
return OK;
}
int PrintList(SqList L)
{
for (int i=0;i<L.iLength;i++)
{
visit(L.iData[i]);
}
printf("\n");
return OK;
}
/************************************************************************
插入步骤:
1.如果插入位置不合理,抛出异常;
2.如果线性表长度大于等于数组长度,则抛出异常或动态增加容量;
3.从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置;
4.将要插入元素填入位置i处;
5.表长加1。
/************************************************************************/
int ListInsert(SqList* L,int i,ElemType e)
{
if (i<0 || i>L->iLength+1) /*插入位置不合理*/
{
printf("插入位置不合理\n");
return ERROR;
}
if (L->iLength>=MAX_SIZE) /*线性表长度大于数组长度*/
{
printf("线性表长度大于数组长度\n");
return ERROR;
}
if (i<=L->iLength) /*若插入位置不在表尾*/
{
for (int k=L->iLength;k>=i;k--) /*从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置*/
{
L->iData[k] = L->iData[k-1];
}
}
L->iData[i-1] = e; /*将要插入的元素填入位置i处*/
L->iLength++; /*表长加1*/
return OK;
}
/************************************************************************
删除步骤:
1.如果删除位置不合理,抛出异常;
2.取出删除元素;
3.从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置;
4.表长减1。
/************************************************************************/
int ListDelete(SqList* L,int i,ElemType* e)
{
int k = 0;
if (L->iLength == 0)
{
return ERROR;
}
if(i<0 || i>L->iLength)
{
return ERROR;
}
*e = L->iData[i-1];
for (k = i;k<L->iLength;k++)
{
L->iData[k-1] = L->iData[k];
}
L->iLength--;
return OK;
}
int GetElem(SqList L,int i,ElemType* e)
{
if (L.iLength==0 || i<1 || i>L.iLength)
{
return ERROR;
}
*e = L.iData[i-1];
return OK;
}
int LocateElem(SqList L,ElemType e)
{
int i;
if (L.iLength==0)
return 0;
for(i=0;i < L.iLength;i++)
{
if (L.iData[i]==e)
break;
}
if (i == L.iLength)
{
return ERROR;
}
if(i>=L.iLength)
return 0;
return i+1;
}
int ClearList(SqList* L)
{
L->iLength = 0;
return OK;
}
int main()
{
SqList L;
InitList(&L);
int value=0,pos = 0,k=0;
ElemType e = 0;
printf("初始化成功,L.length=%d\n",L.iLength);
printf("\n1.遍历线性表 \n2.线性表赋值 \n3.线性表插入 \n4.清空线性表 \
\n5.查找表中元素 \n6.判断元素是否在表中 \n7.删除某个元素 \n0.退出 \n请选择你的操作:\n");
char opp = '0';
while (opp != '\0')
{
scanf("%c",&opp);
switch(opp)
{
case '1':
PrintList(L);
printf("\n");
break;
case '2':
L = CreateList(L);
printf("CreateList\n");
PrintList(L);
printf("\n");
break;
case '3':
printf("请输入插入元素位置:");
scanf("%d",&pos);
printf("请输入插入元素的值:");
scanf("%d",&value);
ListInsert(&L,pos,value);
printf("插入完毕,现在线性表为:\n");
PrintList(L);
printf("\n");
break;
case '4':
printf("清空线性表\n");
ClearList(&L);
printf("线性表长度Length=%d",L.iLength);
break;
case '5':
printf("你要查找第几个元素? ");
scanf("%d",&pos);
GetElem(L,pos,&e);
printf("第%d个元素的值为:%d\n",pos,e);
break;
case '6':
printf("输入你想知道是否在表中的数值: ");
scanf("%d",&e);
k=LocateElem(L,e);
// 这里假定随机数组中的元素互不重复
if(k)
printf("值为%d是表中的第%d个元素\n",e,k);
else
printf("没有值为%d的元素\n",e);
break;
case '7':
printf("要删除第几个元素?");
scanf("%d",&pos);
ListDelete(&L,pos,&e);
printf("删除完毕,现在线性表为:\n");
PrintList(L);
printf("\n");
break;
}
}
return OK;
}