线性表是n个类型相同数据元素的有限序列,对n>0,除第一个元素无直接前驱,最后一个元素没有直接后继外,其他都是每个元素有一个直接前驱和直接后继,而且是一对一的关系。
线性表:顺序存储,链式存储。
(1) 按内容查找:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define ElemType int
#define MAXSIZE 100 /*此处的宏定义常量表示线性表可能达到的最大长度*/
typedef struct
{ ElemType elem[MAXSIZE]; /*线性表占用的数组空间*/int last; /*记录线性表中最后一个元素在数组elem[ ]中的位置(下标值),空表置为-1*/
}SeqList;int Locate(SeqList L, ElemType e)
{ int i=0; /*i为扫描计数器,初值为0,即从第一个元素开始比较*/while ((i<=L.last)&&(L.elem[i]!=e)) /*顺序扫描表,直到找到值为key的元素, 或扫描到表尾而没找到*/i++; if (i<=L.last)return(i+1); /*若找到值为e的元素,则返回其序号*/elsereturn(-1); /*若没找到,则返回空序号*/
}void main()
{SeqList l;int p,q,r;int i;printf("请输入线性表的长度:");scanf("%d",&r);l.last = r-1;printf("请输入线性表的各元素值:\n");for(i=0; i<=l.last; i++){scanf("%d",&l.elem[i]);}printf("请输入要查找的元素值:\n");scanf("%d",&q);p=Locate(l,q);if(p == -1)printf("在此线性表中没有该元素!\n");elseprintf("该元素在线性表中的位置为:%d\n",p);
}
(2)插入操作:
将原表中位置n,n-1...i..上的结点,依次后移到位置n+1,n,n-1...i...的位置。空出i的位置,将元素e插入。
#define OK 1
#define ERROR 0
int InsList(SeqList *L,ElenType e)
{
int k;
if((i<1)||(i>L->Last+2))
{
printf("不合法!\n");
return (ERROR);
}
if(L->Last>=MAXSIZE-1)
{
printf("表满!\n");
return (ERROR);
}
for(k=L->Last;k>=i-1;k--)
{
L->elem[k+1]=L->elem[k];//后一一个位置
L->elem[i-1]=e;//将e插入
L->last++;
return(Ok);
}
}
(3)删除操作:
将原表中位置i+1,i+2..n上的结点,依次前移到位置i,i+1...n的位置,将元素e删除。
int DellList(SeqList *L,int i,ElemType *e)
{
int k;
if(i<1|| i>L->last+1)
{
printf("错误!\n");
return(ERROR);
}
*e=L->elem[i-1];
for(k=i;i<=L->last;k++)
L->elem[k-1]=L->elem[k];
L->last--;
return (OK);
}