线性表
1、逻辑结构
定义:L=(a1,…ai…,an), a1唯一一个后继,an有唯一前驱,ai有唯一后继和前驱。n=0表示空表!
运算:
A: get(L,i):取第i个位置的元素。
B: insert(&L,i,e):第i个位置前插入新元素e;i的合法值为1<=i<=n+1;i=n+1表示在表尾插入!
C: delete(&L,i):删除第i个元素;i的合法值为1<=i<=n;
2、物理结构
1)顺序存储:
特点:静态表,随机存储(逻辑相邻物理也相邻),便查找,不便插入删除。
运算:
A: get(L,i) 直接获得。
B: insert(&L,i,e) 算法步骤:
1)i的合法性检查,1<=i<=n+1 ; 2)检查线性表是否满(n=maxlen满);3)将第n个至第i个元素后移一个单元;4)在i位置插入元素 5)表长度加1.
C: delete(&L,i)算法步骤:
1)i的合法性检查,1<=i<=n ; 2)检查线性表是否空;3)将第i+1个至第n个元素前移一个单元,删除元素;4)表长度减1.
2)链式存储:
特点:动态表,不按逻辑关系存储(通过next找到逻辑后继),便插入删除,不便查找。
链表头结点的引入时为了使算法判空和处理一致!故,L->next = null 来判空。
运算:
A: get(L,i)
1)初始: p=L->next ; j=1 ;p初试为L的第一个节点,j指针与p所指向节点对应。
2)定位: while(p!=NULL && j<i){ p=p->next;j=j+1;} 找到i元素
3)判断:if(p!=NULL && j==i) 找到;否则i值不合法!
B: insert(&L,i,e)
1)初始: p=L ; j=0 ;p初试为L头节点,j指针与p所指向节点对应,j=0表示指向头结点。
2)定位: while(p!=NULL && j<i-1){ p=p->next;j=j+1;}
3)判断:if(p==NULL || j>i-1) i值不合法!否则合法,进行插入。
4)插入:new->next = p->next;p->next = new;
C: delete(&L,i)
1)初始:p=L ;j=0;
2)定位:while(p->next!=NULL && j<i-1){ p=p->next;j=j+1;} 找i元素,并使p指向其前驱
3)判断:if(p->next==NULL || j>i-1) i值不合法!否则(p->next&&j==i-1)合法进行删除。
4)删除:q=p->next;p->next = p->next->next;dispose(q);
3、其他链表
循环单链表:与单链表类似,只是判空为:p->next = L(头结点) 为空 !
双向链表:判空为 L->prior = NULL && L->next =NULL
双向循环表:判空为 L->prior = L->next = L
4、应用
1)有序表递增表LA与LB合并成有序表LC,单链表实现则要求不生成新结点。
算法:LC设空,将LA、LB所有元素依次插入到LC中。用指针pa,pb,pc分别指向LA,LB,LC当前点。
a<b有c=a,否则c=b;
void merge(LinkList LA,LinkList LB,LinkList*LC)
{
LinkList pa = LA->next,pb=LB->next,pc;
ElemType a,b;
(*LC)=LA;pc=(*LC);
while(pa!=NULL&&pb!=NULL)
{
a = pa->data; b=pb->data;
if(a<=b)
{
pc->next = pa;
pa= pa->next; pc=pc->next;
}
else
{
pc->next = pb;
pb= pb->next; pc=pc->next;
}
}
if(pa!=NULL)
pc->next=pa;
else
pc->next=pb;
}
2)多项式相加。(解决1)问题后,此问题就变得非常简单。)
void add(ploy ax,ploy bx,ploy*cx)
{
ploy pa=ax->next,pb=bx->next,pre;
(*cx)=ax; pre=(*cx); /*pre待插入多项式cx元素的前驱*/
while(pa&&pb)
{
if(pa->exp < pb->exp) /*pa插入cx中*/
{
pre->next = pa;
pre=pa;
pa=pa->next;
}
else if(pa->exp > pb->exp)
{
pre->next = pb;
pre=pb;
pb=pb->next;
}
else
{
if((pa->coef+pb->coef)==0) /*pa与pb相加为0,pa、pb直接后移*/
{
pa=pa->next;pb=pb->next;
}
else /*pa与pb相加,并插入到cx中*/
{
pa->coef = pa->coef+pb->coef;
pre->next=pa;
pre=pa;
pa=pa->next;
pb=pb->next;
}
}
}
pre->next=pa?pa:pb;
}