线性表的定义:线性表是最基本、最简单、也是最常用的一种数据结构。表头具有唯一一个直接后继,表尾有唯一一个直接前驱,表中的元素存在唯一的直接前驱和直接后继。是一对一的关系
从数学角度来讲,树结构和散结构都是图的特例,表结构又是树的特例 (运用到离散数学的知识)
无回路的连通图就是树
散结构就是对应的只含有顶点而没有边的“空图”;
线性表也可以看作是“一元树”;
线性表静态时可以理解为数组,动态时可以看作是链表
例如利用数组a[20]利用线性表定义后一个变量就可以表示与a[20]相同的数组
下面是顺序表插入,删除,查找和合并的代码
首先是定义一个顺序表,利用到结构体
#define Elemtype int //可以用Elemtype代替int
#define maxsize 100
typedef struct stu
{
Elemtype elem[maxsize];
int last; //代表顺序表的长度
}Seqlist;
查找代码
int seek(Seqlist *l,Elemtype e) //查找
{int i;
for(i=0;i<=l->last ;i++)
if(l->elem [i]==e)
return i+1; //找到返回序号,找不到返回-1
return -1;
}
插入代码
void insert(Seqlist *l,int j,Elemtype e) //插入,j是插入位置,e是要插入的元素,Elemtype可代替int
{
if(j<=-1||j>l->last+2)
{printf("数组越界不能插入\n");
return ;
}
int x,i;
for(i=l->last;i>=j-1;i--)
l->elem[i+1]=l->elem[i]; //将l.elem[i]和以后的元素全部往后移动一位,然后将要插入的元素放到相应位置上,最后让线性表的长度加1
l->elem[j-1]=e;
l->last++;
}
删除代码
void delete1(Seqlist *l,Elemtype i) //删除
{int j;
if(i<=-1||i>=100)
{printf("数组越界不能进行删除操作\n");
return ;
}
for(j=i-1;j<=l->last ;j++)
l->elem [j]=l->elem [j+1]; //与插入相似,最后顺序表表的长度减一
l->last--;
}
合并代码
void merge(SeqList *LA, SeqList *LB, SeqList *LC)
{
int i,j,k;
i=0;j=0;k=0;
while(i<=LA->last&&j<=LB->last) //当两顺序表表中都有元素时,根据需求进行比较,取值,当去LA的值时,LB所指向的指针不变,与LA的下一位比较,同理可得去LB时
if(LA->elem[i]<=LB->elem[j])
{
LC->elem[k]= LA->elem[i];
i++;
k++;
}
else
{
LC->elem[k]=LB->elem[j];
j++;
k++;
}
while(i<=LA->last) /*当表LA有剩余元素时,则将表LA余下的元素赋给表LC*/
{
LC->elem[k]= LA->elem[i];
i++;
k++;
}
while(j<=LB->last) /*当表LB有剩余元素时,则将表LB余下的元素赋给表LC*/
{
LC->elem[k]= LB->elem[j];
j++;
k++;
}
LC->last=LA->last+LB->last+1;
}