线性结构:线性表,栈和队列,串。
线性结构特点:1、存在唯一的一个第一个数据元素。2、存在唯一的一个最后一个数据结构。3、除开头结尾元素外,每个元素只有一个前驱,一个后继。
顺序表相关代码:
例2-1.将所有在线性表Lb中但不在La中的数据元素插入到La中
void union(list &La,list Lb){
La_len=listLength(La),Lb_len=listLength(Lb) ;
for(int j=0;j<Lb_len;j++){
getlem(Lb,j,e);
if(!LocateElem(La,e,equal)) ListInsert(La,La_len++,e);
}
}
例2-2.La,Lb非递减排列,合并La,Lb使其仍然满足非递减
void union(List La,List Lb,List &Lc){
La_len=ListLength(La),Lb_len=ListLength(Lb);
int i=1,j=1,k=0;
while(i<=La_len&&j<=Lb_len){
getElem(La,i,ai),getElem(Lb,j,bj);
if(ai<=bj) ListInsert(Lc,++k,ai),i++;
else ListInsert(Lc,++k,bj),j++;
}
if(La_len>Lb_len) ListInsert(Lc,++k,ai);
else ListInsert(Lc,++k,bj);
}
算法2.3
status ListInsert_sq(splits &L,int i,Elemtype){
if(I<1|| I>L.length+1) return error;//在顺序表的第I个位置之前插入一个新元素 e
if(L.length>=L.listsize){
newbase=(Elemtype *)realloc(L.elem,(L.listsize+listincrement)* sizeof(Elemtype));
if(!newbase) exit(overflow);
L.elem=newbase;
L.listsize+=listincrement;
}
q=&(L.elem[i-1]);
for(p=&(L.elem[L.length-1]);p>=q;--p) *(p+1)=*p;
*q=e;
++L.length;
return ok;
}
算法2.4
status listdelet(sqlist &L,int I,Elemtype &e ){
if((i<1)||(i>L.length)) return error;
p=&(L.elem[i-1]);
e=*p;
q=L.elem+L.length-1;
for(++p;p<=q;++p)
*(p-1)=*p;
--L.length;
return ok;
}
算法2.5
int locatelem_sq(sqlist L,elemtype e,status (* compare)(elemtype,elemtype) ){
i=1;
p=L.elem;
while(i<=Length&&!(*compare)(*p++,e)) ++I;
if(I<=L.length) return I;
else return 0;
}
算法2.6(对比算法2.2)
void mergelist_sq(sqlist La,sqlist La,sqlist &Lc){
pa=La.elem,pb=Lb.elem;
Lc.listsize=Lc.listlength=La.length+Lb.length;
pc=Lc.elem=(Elemtype*)malloc(Lc.listsize*sizeof(Elemtype));
pa_last=La.elem+La.length-1;
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++;
}
线性表的链式表示和实现:
status getlem_L(LinkList L,int i,ElemType &e){
p=L->next; //返回第I个元素的值
int j=1;
while(p&&j<i){
p=p->next;
j++;
}
if(!p||j>i) return error;
e=p->data;
return ok;
}
算法2.8
status ListInsert_L(LinkList &L,int I,Elemtype e){
p=L; //第i 个元素之前插入元素e
int j=0;
while(p&&j<i-1){
p=p->next;
j++;
}
if(!p||j>I-1) return error;
s=(LNode *)malloc(sizeof(LNode));
s->data=e;s->next=p->next;
p->next=s;
return ok;
}
算法2.9
status Listdelete_L(Linklist &L,int i,Elemtype &e){
p=L; //删除第i个元素的值
int j=0;
while(p&&j<i-1){
p=p->next;
j++;
}
if(j>I-1 || p->next==NULL) return error;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return ok;
}
算法2.10
void create list_L(Linklist &L,int n)
{ //逆序输入n个元素的值
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
for(int I=n;i>0;i--){
p=(LNode *)malloc(sizeof(LNode));
scanf(&p->data);
p->next=L->next; //r->next=p;r=p;尾插法
L->next=p;
}
}
算法2.11
void mergeList_L(Linklist La,Linklist Lb,Linklist &Lc){
pa=La->next; //合并两个有序链表
pb=Lb->next;
Lc=(LNode *)malloc(sizeof(LNode));
Lc->next=NULL;
while(pa&&pb){
if(pa->data<=pb->data){
Lc->next=pa;
Lc=pa;
pa=pa->next;
}
else{Lc->next=pb;Lc=pb;pb=pb->next;}
Lc->next=pa?pa:pb;
}
}
算法2.12(静态链表相关代码略)
算法2.18
status ListInsert_DUL(Dulinklist &L,int I,Elemtype e){
s=(DuLNode *)malloc(sizeof(DuLNode));
s->data=e;
s->prior=p->prior;
p->prior->next=s;
s->next=p;
p->prior=s;
return ok;
}
算法2.19
status Listdelet(DuLinklist &L,int i,Elemtype &e){
e=p->data;
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
return ok;
}
一元多项式的表示及相加