数据结构——线性表之顺序存储

来源:互联网 发布:java上传图片回显 编辑:程序博客网 时间:2024/06/05 07:43

数据结构——线性表之顺序存储

1、线性表的顺序存储结构特点

  • 第i个元素和i+1个元素的存储位置满足:LOC(ai+1)=LOC(ai)+m (其中m是指每个元素所占的存储单元)即顺序存储将线性表的元素放在一组连续的存储单元中。在线性表中相邻的两个元素在物理存储单元中也相邻
  • 第i个元素与第一个元素的存储位置满足:LOC(ai)=LOC(a1)+(i-1)*m

2、线性表的优缺点

  • 优点:(1)顺序存储反应了线性表中元素的逻辑关系(2)任何一个元素都可以随机存取
  • 缺点:(1)删除、插入元素时需要移动大量数据(2)扩容问题,在C++中数组中的元素存放在连续的单元中,所以通常使用数组实现顺序存储,但是数组的长度会限制程序。

3、实现代码

#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <string.h>/**线性表的顺序存储**/#define Max_Size 100//定义线性表最大长度 顺序存储的缺陷之一typedef struct{char name[10];int age;}Data;typedef struct{Data list[Max_Size];int length;}SqlList;/**初始化**/void InitList(SqlList *L){//创建空线性表,将长度置为0L->length = 0;}/**判断是否为空**/int ListEmpty(SqlList L){//为空返回1,否则返回0if(L.length==0) return 1;else return 0;}/**返回线性表长度**/int ListLength(SqlList L){return L.length;}/**清空线性表**/void ClearList(SqlList *L){L->length = 0;}/**获得第i个元素**/int GetElem(SqlList L,int i,Data *e){//找到返回1否则返回0//看是否有第i个元素if(0<i<L.length){//将第i个元素放在e中Data d = L.list[i];strcpy(e->name,d.name);e->age = d.age;}else{return 0;}return 1;}/**查找元素e的位置**/int LocateElem(SqlList L,Data e){//找到返回位置否则返回-1int len = ListLength(L);Data d;for(int i = 0;i<len;i++){d = L.list[i];if(strcmp(d.name,e.name)&&d.age==e.age){return i;}}return -1;}/**插入新元素**/void InsertList(SqlList *L,int i,Data e){//判断线性表是否已经存满int len = ListLength(*L);while(len>i){L->list[len+1] = L->list[len];len--;}L->list[i] = e;L->length++;}/**删除第i个位置上的元素**/void DeleteList(SqlList *L,int i,Data *e){//将删除的元素放在e中int len = ListLength(*L);strcpy(e->name,L->list[i].name);e->age = L->list[i].age;for(int j = i;j<len;j++){L->list[j] = L->list[j+1];}L->length--;}/**打印线性表**/void PrintList(SqlList L){int len = ListLength(L);Data d;printf("name\tage\n");for(int i = 0;i<len;i++){d = L.list[i];printf("%s\t%d\n",d.name,d.age);}}void main(){int i=1,position;char name[10];SqlList L;Data d;int code;int len;int age;while(i){printf("1、创建线性表\t");printf("2、添加新元素\t");printf("3、打印线性表\n");printf("4、删除元素 \t");printf("5、查找元素 \t");printf("6、清空线性表\n");printf("7、定位元素\t");printf("8、是否为空\n");scanf("%d",&i);switch (i){case 1:InitList(&L);break;case 2:printf("Input the position to insert: ");scanf("%d",&position);if(position<0||position>ListLength(L)){printf("Error!Wrong position to insert!\n");break;}else if(ListLength(L)>=Max_Size){printf("Error!No space to insert new element!\n");break;}else{printf("Input the name :");scanf("%s",&name);printf("Input the age :");scanf("%d",&age);strcpy(d.name,name);d.age = age;InsertList(&L,position,d);}break;case 3:PrintList(L);break;case 4:printf("Input the position to delete: ");scanf("%d",&position);len = ListLength(L);if(position<0||position>len){printf("Error!Wrong position to delete!\n");}else if(len==0){printf("Error!The list has been empty!\n");}else{DeleteList(&L,position,&d);printf("Delted (%s,%d)\n",d.name,d.age);}break;case 5:printf("Input the position to find: ");scanf("%d",&position);code = GetElem(L,position,&d);if(code==1){printf("Find the %d element (%s,%d)\n",position,d.name,d.age);}else{printf("Can't find it!\n");}break;case 6:ClearList(&L);break;case 7:printf("Input the name :");scanf("%s",&name);printf("Input the age :");scanf("%d",&age);strcpy(d.name,name);d.age = age;code = LocateElem(L,d);if(code==-1){printf("Not Find!\n");}else{printf("It's position is %d\n",code);}break;case 8:code = ListEmpty(L);if(code==1){printf("It's empty!\n");}else{printf("It's not empty!\n");PrintList(L);}break;}}system(0);}

0 0
原创粉丝点击