#include<stdio.h>
/*线性表的特点:同一性、有穷性、有序性*/
//线性表的抽象数据类型:数据元素、结构关系、基本操作
//基本操作:InitList/ListLength/GetData/InsList/DelList/Locate/DestroyList/ClearList/EmptyList
//增删改查+基本属性
#define MAXSIZE 100
#define ElemType char
//线性表的线性存储结构(如果是空表last值是-1)
typedef struct
{
ElemType elem[MAXSIZE];
int last;
}SeqList;
//可以构造结构体类型的变量和对应的指针变量,区别就是变量直接用L.a访问,而指针变量用L->a访问结构体中对应的元素
//查找操作(共两种,按序号查找和按内容查找)
/*int GetData(SeqList L, int i)
{ 判错的就省略了,意思意思得了
return L.elem[i-1];
} */
int Locate(SeqList L, ElemType e)
{
i = 0;
while((i<=L.last) && (L.elem[i]!=e)){
i++;
}
if(i<=L.last)
return (i+1);
else
return -1;
}
//注意这里我们返回的是标号
//插入操作:注意插入操作要用指针变量(删除同理)
#define OK 1
#define ERROR 0
int InsList(SeqList *L, int i, ElemType e)
{
if(i<1 || i>L->last+2){
printf("插入位置不合法\n");
return (ERROR);
}
if(L->last+1 > MAXSIZE){
printf("表已满故无法插入\n");
return (ERROR);
}
int k;
for(k=L->last;k>=i-1;k--){
L->elem[k+1] = L->elem[k];//元素从后往前依次往后移
}
//先移走,再变动
L->elem[i-1] = e;
L->last++;
return (OK);
}
//删除操作:保存被删除的元素到元素类型的指针变量e
int DelList(SeqList *L, int i, ElemType *e)
{
if(i<1 || i>L->last+1)
{
printf("删除位置不合法\n");
return (ERROR);
}
if (L->last == -1)
{
printf("链表为空,不能删除!\n");
return (ERROR);
}
e = L->elem[i-1];
int k;
for(k = i; k<=L->last; k++){
L->elem[k-1] = L->elem[k];//元素从前到后依次往前移
}
L->last--;
return (OK);
}
/*例题:有序顺序表LA和LB、将它们合成一个有序顺序表LC(非递减排序)*/
//其实这段代码的总体思路和归并排序是一毛一样的
void mergeList(SeqList *LA, SeqList *LB, SeqList *LC)
{
int i=0,j=0,k=0;
while((i<=LA->last) && (j<=LB->last))
{
if(LA->elem[i]<=LB->elem[j]){
LC->elem[k] = LA->elem[i];
k++;i++;
}
else{
LC->elem[k] = LB->elem[j];
k++;j++;
}
}
while(i<=LA->last){
LC->elem[k] = LA->elem[i];
k++;i++;
}
while(j<=LB->last){
LC->elem[k] = LB->elem[j];
k++;j++;
}
LC->last = k-1;
}
数据结构-线性表-1顺序线性表
最新推荐文章于 2024-05-03 16:54:29 发布