线性表的操作
- 建立新的线性表
- 给线性表赋初始值
- 删除表中某个元素
- 将某个元素插入表中
- 将两个顺序表进行升序合并
可运行代码如下:
/*
Name: 线性表
Copyright:
Author: Anderson
Date: 04/09/17 20:48
Description: linear_list;
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
//头文件
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100//线性表初始空间分配量
#define LISTINCREMENT 10//线性表空间分配的增量
//宏定义
typedef int Status;
typedef int ElemType;
//定义类型
typedef struct LNode
{
ElemType *elem;//储存空间的基地址
int length;//当前的长度
int listsize;//当前分配的储存容量
}SqList;
//结构体
Status initList(SqList &L,int length)// 构造空的线性表
{
L.elem =(ElemType *)malloc(length *sizeof(ElemType));//动态分配储存空间
if(!L.elem )
exit (OVERFLOW);//如果 分配失败,退出
L.length =0;//初始长度为0;
L.listsize =length;//初始储存容量为100;
return OK;
}
Status insertList(SqList &L,ElemType e,int i)//插入操作,在第i位置
{
ElemType *p,*q;
if(i<1||i>L.length+1 )//判断i的正确性
return ERROR;//不正确就结束
if(L.length >=L.listsize)
{
ElemType *newbase=(ElemType *)realloc(L.elem ,(L.listsize +LISTINCREMENT)*sizeof(ElemType));
if(!newbase)
exit(OVERFLOW);//分配失败
L.elem =newbase;//成功后,分配新基值
L.listsize +=LISTINCREMENT;//增加储存容量
}
q=&L.elem [i];//q 为插入的位置
for(p=&(L.elem [L.length]);p>=q;--p)
{
*(p+1)=*(p);
}
*q=e;
++L.length;
return OK;
}
Status deleteListElem(SqList &L,int i,ElemType &e)
{
int *p,*q;
if(i<1||i>L.length )
return ERROR;
q=&L.elem [i];
e=*q;
for(p=q;p<(L.elem +L.length);p++)
{
*(p)=*(p+1);
}
L.length--;
return OK;
}
void mergeList(SqList La,SqList Lb,SqList &Lc)
{
ElemType *pa,*pb,*pc;
Lc.listsize =La.length+Lb.length;
initList(Lc,Lc.listsize );
Lc.length =Lc.listsize ;
pc=Lc.elem +1;
pa=La.elem +1;
pb=Lb.elem +1;
while(pa<=&La.elem [La.length ]&&pb<=&Lb.elem [Lb.length])
{
if(*pa<=*pb)
*pc++=*pa++;
else
*pc++=*pb++;
}
while(pa<=&La.elem [La.length ]) *pc++=*pa++;
while(pb<=&Lb.elem [Lb.length ]) *pc++=*pb++;
}
int cmp(int x,int y)
{
return x==y;
}
int Locate(SqList L,ElemType e,Status(*compare)(ElemType,ElemType))
{
int i=0;
ElemType *p;
p=L.elem ;
while(i<=L.length &&!(*compare)(*p++,e))
++i;
if(i<L.length )return i;
else return 0;
}
void printList (SqList L,int p)
{
if(p==1)
{
printf("当前值:");
for(int i=1;i<=L.length ;i++)
{
printf("%d ",*(L.elem +i));
}
printf("\n");
}
else if(p==2)
{
printf("删除后:");
for(int i=1;i<=L.length ;i++)
{
printf("%d ",*(L.elem +i));
}
printf("\n");
}
else if(p==3)
{
printf("插入后:");
for(int i=1;i<=L.length ;i++)
{
printf("%d ",*(L.elem +i));
}
printf("\n");
}
else if(p==4)
{
printf("顺序表合并:");
for(int i=1;i<=L.length ;i++)
{
printf("%d ",*(L.elem +i));
}
printf("\n");
}
}
main()
{
SqList La,Lb,Lc;
ElemType e;
int init,i;
init=initList(La,LIST_INIT_SIZE);
int data[6]={1,2,3,4,5,6};
for(i=0;i<6;i++)
{
insertList(La,data[i],i+1);
}
printf("LA:\r\n");
printList(La,1);
deleteListElem(La,6,e);
printList(La,2);
insertList(La,e,6);
printList(La,3);
printf("LB:\r\n");
initList(Lb, LIST_INIT_SIZE);
int Bdata[5] = {5,6,7,8,9};
for (i=0; i<5;i++)
{
insertList(Lb, Bdata[i], i+1);
}
printList(Lb,1);
mergeList(La, Lb, Lc);
printList(Lc,4);
printf("locate==%d\n",Locate(Lc,4,cmp));
}