第二章 线性表

                     线性表
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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值