【数据结构复习|核心代码】线性表的顺序存储
顺序存储定义:把逻辑上相邻的数据元素存储在物理上也相邻的存储单元中的数据结构。
简单来说,就是:逻辑上相邻,物理上也相邻。
顺序存储方法:用一组地址连续的存储单元依次存储线性线性表的元素,可通过数组来实现。
地址计算:设首元素a1的存放地址为LOC(a1),称为首地址,设每个元素占用存储空间(地址长度)为L字节,则地址计算公式:LOC(a i)= LOC(a 1)+(i-1)*L。
结构定义:
typedef int ElemType;//线性表数据元素类型
typedef struct
{
ElemType data[MAXSIZE];//下标从0开始,但是对线性表的操作中的下标从1开始:第1个元素其实就是下标为0的元素
int length;//指示线性表的终端结点在表中的下标值
}SqList;
基本操作:
int CreatList(SqList* L)
{
int i;
printf("插入多少个元素(10-20)?\n");
scanf("%d",&(L->length));
if(L->length<0||L->length>MAXSIZE)
return FALSE;
for(i=1;i<=L->length;i++)
{
// cout<<"请输入顺序线性表的第"<<i<<"个元素:";
// cin>>L->data[i-1];
L->data[i-1]=i;
}
return TRUE;
}
int GetElem(SqList L, int i, ElemType* e)
{
if(L.length==0 || i<1|| i>L.length)
return FALSE;
*e=L.data[i-1];
return TRUE;
}
int ListInsert(SqList* L,int i,ElemType e)
{
int k;
if(L->length==MAXSIZE || i<1|| i>L->length+1)//线性表满,或者i的范围不在合理范围内时返回错误
return FALSE;
if(i<=L->length)//不在表尾
{
//插入位置的后续元素后移一位
for(k=L->length-1;k>=i-1;k--)
L->data[k+1]=L->data[k];// 倒序挪动位置,避免覆盖问题
}
L->data[i-1]=e;//插入元素
L->length++;
return TRUE;
}
int ListDelete(SqList* L,int i,ElemType* e)
{
int k;
if(L->length==0 || i<1|| i>L->length)//线性表满,或者i的范围不在合理范围内时返回错误
return FALSE;
*e=L->data[i-1];//取出元素
if(i<=L->length)//不在表尾
{
//插入位置的后续元素前移一位
for(k=i-1;k<L->length-1;k++)
L->data[k]=L->data[k+1];// 倒序挪动位置,避免覆盖问题
}
L->length--;
return TRUE;
}
int ListEmpty(SqList L)
{
if (L.length==0)
return TRUE;
return FALSE;
}
void clearList(SqList* L)
{
L->length=0;
}
int LocateElem(SqList L,ElemType e)//成功则返回元素的序号(从1开始),失败则返回0
{
int i=0;
for(i=0;i<L.length;i++)
if(L.data[i]==e)
return i+1;
return 0;
}
int ListLength(SqList L)
{
return L.length;
}
void display(SqList L)
{
int i;
for(i=0;i<L.length;i++)
printf("%d ",L.data[i]);
printf("\n");
}
//不调用底层程序,直接编程实现顺序表合并,这种方法较为复杂
int UnionList1(SqList* L1,SqList* L2,SqList* L)
{
int i,j,k;
L->length=0;
for(i=0;i<L1->length;i++)
{
L->data[i]=L1->data[i];
}
for(j=0;j<L2->length;j++)
{
for(k=0;k<L1->length;k++)
{
if(L2->data[j]==L1->data[k])
break;
}
if(k==L1->length)
{
if(i>=MAXSIZE)
return FALSE;
L->data[i]=L2->data[j];
i++;
}
}
L->length=i;
return TRUE;
}
//调用底层程序来查找元素,减轻了工作量
int UnionList(SqList* L1,SqList* L2,SqList* L)
{
int i,j;
L->length=0;
for(i=0;i<L1->length;i++)
{
L->data[i]=L1->data[i];
}
for(j=0;j<L2->length;j++)
if(LocateElem(*L1,L2->data[j])==0)
{
if(i>=MAXSIZE)
return FALSE;
L->data[i]=L2->data[j];
i++;
}
L->length=i;
return TRUE;
}
主函数:
int main()
{
SqList list;
int num;
ElemType elem;
int flag;
printf(" 1.顺序表的创建和显示\n");
if(!CreatList(&list))
printf("顺序表创建失败!\n");
else
printf("顺序表创建成功!\n ");
//顺序表的显示
display(list);
printf("\n\n");
printf(" 2.按元素查找\n");
num=LocateElem(list,3);
printf("3是顺序表的第%d个元素",num);
printf("\n\n\n");
printf(" 3.按位置查找\n");
GetElem(list,4,&elem);
printf("顺序表的第4个元素是%d",elem);
printf("\n\n\n");
printf(" 4.顺序表的插入\n");
ListInsert(&list,2,10);
printf("在第2个位置插入10后:\n ");
display(list);
printf("\n\n");
printf(" 5.删除元素\n");
ListDelete(&list,5,&elem);
printf("删掉第5个元素:%d\n",elem);
printf("该表的长度为:%d\n ",ListLength(list));
display(list);
printf("\n\n");
printf(" 6.清空顺序表\n");
printf("清空顺序表前-----");
if(!ListEmpty(list))
{
printf("当前顺序表不是空表!\n");
clearList(&list);
printf("清空顺序表后-----");
if(ListEmpty(list))
printf("当前顺序表是空表!\n");
}
printf("\n\n");
printf(" 7.合并顺序表\n");
SqList list1={{0,1,2,3,4,5,6,7},8},list2={{5,6,7,8,9,10,11,1,12},9},list3;
flag=UnionList(&list1,&list2,&list3);
if(!flag)
printf("合并后,顺序表的长度超过最大范围");
printf("该表的长度为:%d\n ",ListLength(list3));
display(list3);
printf("\n\n");
return 0;
}
实验截图:
这是我第一次写博客,即将软件设计师考试了,最近会坚持联系以前的代码,加油!
时间:2019-05-01
地点:湖南文理学院E3-A519