数据结构-线性表(linear_list)
1.基本定义
(1)线性表中每一个元素都只存在一个前驱和一个后继。
(2)同一线性表中的元素必定具有相同的特性。
(3)线性表中元素的个数 n 定义为线性表的长度,n=0 时称为空表。
(4)ai 是第 i 个元素,称 i 为数据元素 ai 在线性表中的位序。
2. 线性表的实现及12个操作
(1)顺序表
#include<iostream>
#include<malloc.h>
#define list_int_size 100
#define listincrement 10
#define error 0
#define ok 1
using namespace std;
typedef struct{
int *elem;
int length;
int listsize;
}SqList;
int InitList_Sq(SqList &L){
L.elem=new int[list_int_size];
if(!L.elem) return error;
L.length=0;
L.listsize=list_int_size;
return ok;
}
int ListInsert_Sq(SqList &L,int i,int e){
if(i<1||i>L.length+1) return error;
if(L.length>=L.listsize){
L.elem=(int *)realloc(L.elem,(L.listsize+listincrement)*sizeof(int));
if(!L.elem) return error;
L.listsize+=listincrement;
}
int *q=&(L.elem[i-1]);
for(int *p=&(L.elem[L.length-1]);p>=q;--p) *(p+1)=*p;
*q=e;
L.length++;
return ok;
}
int ListDelete(SqList &L,int i,int &e){
if(i<1||i>L.length) return error;
int *p=&(L.elem[i-1]);
e=*p;
int *q=L.elem+L.length-1;
for(++p;p<=q;++p){
*(p-1)=*p;
}
L.length--;
return ok;
}
int LocateElem(SqList L,int e){
int i=1;
int *p=L.elem;
while(i<=L.length&&*p++!=e) i++;
if(i<=L.length) return i;
else return 0;
}
void MergeList_Sq(SqList La,SqList Lb,SqList &Lc){
int *pa=La.elem,*pb=Lb.elem;
Lc.listsize=Lc.length=La.length+Lb.length;
int *pc=Lc.elem=new int[Lc.listsize];
if(!Lc.elem) exit(error);
int *ppa=La.elem+La.length-1,*ppb=Lb.elem+Lb.length-1;
while(pa<=ppa&&pb<=ppb){
if(*pa<=*pb) *pc++=*pa++;
else *pc++=*pb++;
}
while(pa<=ppa) *pc++=*pa++;
while(pb<=ppb) *pc++=*pb++;
}
int main(){
SqList L;
InitList_Sq(L);
for(int i=1;i<=120;i++)
ListInsert_Sq(L,i,i);
cout<<LocateElem(L,1)<<endl;
int e;
ListDelete(L,1,e);
cout<<e<<endl;
MergeList_Sq(L,L,L);
cout<<LocateElem(L,3)<<endl;
return 0;
}
(2)链表(线性链表,单链表)
#include<iostream>
#include<malloc.h>
#define error 0
#define ok 1
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
int ListInsert_L(LinkList &L,int i,int e){
LinkList p=L;
int j=0;
while(p&&j<i-1){
p=p->next;
j++;
}
if(!p||j>i-1) return error;
LNode *s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
return ok;
}
int GetElem_L(LinkList L,int i,int &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;
}
int ListDelete_L(LinkList &L,int i,int &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;
LNode *s=p->next;
p->next=s->next;
e=s->data;
free(s);
return ok;
}
int main(){
int e;
LinkList L;
ListInsert_L(L,1,1);
GetElem_L(L,1,e);
cout<<e<<endl;
ListDelete_L(L,1,e);
cout<<e<<endl;
return 0;
}
(3)静态单链表 略
(4)循环链表,双向链表 略略略 orz。。。。