1.线性表的顺序表示和实现
#include<iostream>
#include <cstdio>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int ElemType;
typedef int Status;
typedef struct
{
ElemType *elem;
int length;
int listsize;
}SqList;
Status InitList_Sq(SqList &L)
{
L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
}
Status ListInsert_Sq(SqList &L,int i,ElemType e)
{
if(i<1||i>L.length+1)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;
}
ElemType *q=&(L.elem[i-1]);
for(ElemType *p=&(L.elem[L.length-1]);p>=q;p--)*(p+1)=*p;
*q=e;
L.length++;
return OK;
}
Status ListDelete_Sq(SqList &L,int i,ElemType &e)
{
if(i<1||i>L.length)return ERROR;
ElemType *p=&(L.elem[i-1]);
e=*p++;
for(ElemType *q=L.elem+L.length-1;p<=q;p++)*(p-1)=*p;
L.length--;
return OK;
}
Status Equal(ElemType e,ElemType f)
{
if(e==f)return TRUE;
else return FALSE;
}
int LocateElem_Sq(SqList L,ElemType e,Status (*Compare)(ElemType,ElemType))
{
int i=1;
ElemType *p=L.elem;
while(i<=L.length&&!Compare(*p++,e))i++;
if(i<=L.length)return i;
else return 0;
}
Status PrintElem(ElemType e)
{
cout<<e<<' ';
return OK;
}
Status ListTraverse_Sq(SqList L,Status (*Visit)(ElemType))
{
if(L.length==0)return ERROR;
ElemType *p=L.elem;
for(int i=1;i<=L.length;i++)Visit(*p++);
return OK;
}
void MergeList_Sq(SqList La,SqList Lb,SqList &Lc)
{
ElemType *pa=La.elem;
ElemType *pb=Lb.elem;
Lc.listsize=Lc.length=La.length+Lb.length;
ElemType *pc=Lc.elem=(ElemType *)malloc(Lc.listsize*sizeof(ElemType));
if(!Lc.elem)exit(OVERFLOW);
ElemType *pa_last=La.elem+La.length-1;
ElemType *pb_last=Lb.elem+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++;
}
int main()
{
int i,e;
SqList La,Lb,Lc;
InitList_Sq(La);
InitList_Sq(Lb);
for(i=1;i<=9;i++)ListInsert_Sq(La,i,i);
for(i=1;i<=9;i++)ListInsert_Sq(Lb,i,2*i);
ListTraverse_Sq(La,PrintElem);
cout<<endl;
ListTraverse_Sq(Lb,PrintElem);
cout<<endl;
cout<<LocateElem_Sq(La,5,Equal)<<endl;
ListDelete_Sq(La,5,e);
cout<<e<<endl;
ListTraverse_Sq(La,PrintElem);
cout<<endl;
MergeList_Sq(La,Lb,Lc);
ListTraverse_Sq(Lc,PrintElem);
return 0;
}
2.线性表的链式表示和实现
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
LNode *next;
}LNode,*LinkList;
Status GetElem_L(LinkList L,int i,ElemType &e)
{
LinkList p=L->next;
int j=1;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i)return ERROR;
e=p->data;
return OK;
}
Status ListInsert_L(LinkList &L,int i,ElemType e)
{
LinkList p=L;
int j=0;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1)return ERROR;
LinkList s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
Status ListDelete_L(LinkList &L,int i,ElemType &e)
{
LinkList p=L;
int j=0;
while(p->next&&j<i-1)
{
p=p->next;
j++;
}
if(!(p->next)&&j<i-1)return ERROR;
LinkList q=p->next;
p->next=q->next;
e=q->data;
free(q);
return OK;
}
void CreateList_L(LinkList &L,int n)
{
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
for(int i=n;i>0;i--)
{
LinkList p=(LinkList)malloc(sizeof(LNode));
cin>>p->data;
p->next=L->next;
L->next=p;
}
}
void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc)
{
LinkList pa=La->next;
LinkList pb=Lb->next;
LinkList pc=La;
Lc=La;
while(pa&&pb)
{
if(pa->data<=pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
pc->next=pa?pa:pb;
free(Lb);
}
Status ListTraverse_L(LinkList L)
{
LinkList p=L->next;
if(!p)return ERROR;
while(p)
{
cout<<p->data<<' ';
p=p->next;
}
return OK;
}
int main()
{
LinkList La,Lb,Lc;
ElemType e;
cout<<"input La:"<<endl;
CreateList_L(La,5);
cout<<"input Lb:"<<endl;
CreateList_L(Lb,5);
ListTraverse_L(La);
cout<<endl;
ListTraverse_L(Lb);
cout<<endl;
GetElem_L(La,3,e);
cout<<e<<endl;
ListInsert_L(La,3,0);
ListTraverse_L(La);
cout<<endl;
ListDelete_L(La,3,e);
cout<<e<<endl;
ListTraverse_L(La);
cout<<endl;
MergeList_L(La,Lb,Lc);
ListTraverse_L(Lc);
return 0;
}