线性表的顺序表示和实现

#include<iostream>
#include<malloc.h>
using namespace std;
#define Initsize 100
#define Addsize 10
struct list
{
	int *a;//存储空间基址
	int length;//当前表长
	int listsize;//当前分配的存储长度
};
int initlist(list &l);//初始化
int insert_(list l); //插入
int delete_(list &l);//删除
void mergelist(list la,list lb,list &lc);//合并两个非递减有序表
void display(list &l);//输出
int main ()
{
	list L,la,lb,lc;
	if(initlist(L)!=1)//初始化成功返回值为1
	{
		return -1;
	}
	for(int j=0;j<10;j++)
	{
       L.a[j]=j;
	   L.length++;
	}
	initlist(la);
	initlist(lb);
	la=L;
	lb=L;
	cout<<"初始表如下:"<<endl;
	display(L);
	mergelist(la,lb,lc);
	cout<<"合并后如下:"<<endl;
	display(lc);
	insert_(L);
	cout<<"插入成功,结果如下:"<<endl;
	display(L);
	delete_(L);
	cout<<"删除成功,结果如下:"<<endl;
	display(L);
}
int initlist(list &l)
{
	l.a=(int *)malloc(Initsize*sizeof(int));
	if(!l.a) exit(-2);//存储分配失败
		l.length=0;
	l.listsize=Initsize;
	return 1;
}
void display(list &l)
{
	if(l.length==0)
	{
		cout<<"NULL"<<endl;
	}
	for(int i=0;i<l.length;i++)
	{
		cout<<l.a[i]<<" ";
	}
	cout<<endl;
}
int insert_(list l)
{
   int *p, *q;
   int n=1;
   int i,e;
   cout<<"请输入要插入到的位置:";
   cin>>i;
   while(n)
   {
	   if(i<1||i>l.length+1)
       {
	      cout<<"i值不合理,请重新输入:";
          cin>>i;
       }
       else n=0;
   }
   cout<<"请输入要插入的值:";
   cin>>e;
   if(l.length>=l.listsize)
   {
	   int *newbase;
	   newbase =(int *)realloc(l.a,(l.listsize+Addsize)*sizeof(int));//再分配
       if(!newbase) exit(-2);
	   l.a=newbase;
	   l.listsize+=Addsize;
   }
   q=&(l.a[i-1]);
   for(p=&(l.a[l.length-1]);p>=q;p--)
    *(p+1)=*p;
   *q=e;
   l.length++;
   return 1;
}
int delete_(list &l)
{
   int *p, *q;
   int n=1;
   int i,e;
   cout<<"请输入要删除第几个元素:";
   cin>>i;
   while(n)
   {
	   if(i<1||i>l.length+1)
       {
	      cout<<"i值不合理,请重新输入:";
          cin>>i;
       }
       else n=0;
   }
   p=&(l.a[i]);
   e=*p;
   q=l.a+l.length-1;
   for(p;p<=q;p++) *(p-1)=*p;
   l.length--;
   return 1;
}
void mergelist(list la,list lb,list &lc)
{
    int *pa,*pb,*pc;
    int *pa_last,*pb_last;
    pa=la.a;
    pb=lb.a;
    lc.listsize=lc.length=la.length+lb.length;
    pc=lc.a=(int *)malloc(lc.listsize*sizeof(int));
    if(!lc.a) exit(-2);
    pa_last=la.a+la.length-1;
    pb_last=lb.a+lb.length-1;
    while(pa<=pa_last&&pb<=pb_last)
    {
        if(*pa<=*pb) *pc++=*pa++;
        else *pc++=*pb++;
    }
    while(pa<=pa_last) *pc++=*pa++;
    while(pb<=pb_last) *pc++=*pb++;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值