您的位置:首页 > 其它

线性表之顺序存储结构

2016-04-15 10:28 411 查看
线性表的顺序存储是指用一组地址连续的存储单元一次存储线性表的数据元素。在C语言中,可以使用动态数组来实现线性表的顺序存储。

定义:

#define MAXSIZE 100
typedef struct node{   //线性表结构定义
int data[MAXSIZE];  //线性表数据
int length;	//长度
}List,*PList;


初始化:

Plist init_list()
{
Plist pl;
pl=(PList)malloc(sizeof(List));
if(pl)
pl->length=0;
return pl;
}


生成线性表:

void creat_list(PList pl,int a[],int n)
{
int len,i;
len=pl->length;
for(i=0;i<n;i++)
if(len+i<MAXSIZE)
{
pl->data[len+i]=a[i];
pl->length++;
}
}



查找元素:

int locate_L(List l,int x)
{
int i=0;
while(i<L.length && L.data[i] !=x)
i++;
if(i>=L->length )</span> retutn 0;
else return(i+1);
}

插入元素:插入元素时会可能会改变线性表的首地址,所以应用地址作形形参

int insert_L(List &L,int i,int x)  //用线性表L的地址作形参
{
int j;
if(!&L)
{
printf ("表不存在");
return(-2);
}
if (L.length >=MAXSIZE )
{
printf ("表溢出");
return(-1);
}
if (i<1||i>L.length +1)
{
printf ("插入位置不合法");
return(-1);
}
for(j=L.length-1;j>i;j--)
L.data[j+1]=L.data [j];
L.data[i-1]=x;
L.length++;
return(1);
}


删除元素:在地址可能改变时也可采用指针传递

int delete_L(PList pl,int i)  //用线性表指针作形参
{
int j;
if(!pl)
{
printf ("表不存在");
return(-2);
}
if(i<1||i>pl->length )
{
printf("删除位置不合法");
return (-2);
}
for(j=i-1;j<pl->length ;j++)
pl->data [j]=pl->data [j+1];
pl->length --;
return (-1);
}

求两个线性表的交集和并集:A∩B、A∪B

void inter_merge(PList La,PList Lb,int m)
{
int i;
for(i=0;i<La->length ;i++)
{
if(!locate_L (Lb,La->data [i]) && m)  //m=1 时求A与B的交集,将A在B中不存在的元素删除,最后A=A∩B
delete_L (La,i+1);
if(!locate_L (Lb,La->data [i]) && !m)  //m=0 时求A与B的并集,将A在B中不存在的元素插入B,最后B=A∪B
insert_L (*Lb,Lb->length+1 ,La->data [i]);
}
}


应用

void main()
{
int i;
int a[5]={1,2,3,4,5};
PList pl1,pl2;
pl1=init_L ();//初始化
pl2=init_L ();
create_L (pl1,a,5);//生成
create_L (pl2,a,5);

insert_L(*pl1,1,6);//在线性表pl1的位置1插入元素6
delte_L(pl2,2);//删除线性表pl2在位置2的元素
inter_merge(pl1,pl2,1);//求两个线性表的交集,结果存在pl1中
for(i=0;i<pl1->length;i++)
printf("%d\t",pl1->data[i]);//结果应为1  3  4  5
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: