数据结构(线性表)

来源:互联网 发布:数控折弯机如何编程 编辑:程序博客网 时间:2024/04/26 22:39

 1.  试写一算法,在无头结点的动态单链表上实现线性表操作INSERT(L,i,b),并和在带头结点的动态单链表上实现相同操作的算法进行比较。

        Status Insert(LinkList &L,int i,int b)//在无头结点链表L的第i个元素之前插入元素b
{
  p=L;q=(LinkList*)malloc(sizeof(LNode));
  q.data=b;
  if(i==1)
  {
    q.next=p;L=q; //
插入在链表头部

  }
  else
  {
    while(--i>1) p=p->next;
    q->next=p->next;p->next=q; //
插入在第i个元素的位置
  }
}//Insert

2. 已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一高效的算法,删除表中所有值大于mink且小于maxk的元素(若表中存在这样的元素)

Status Delete_Between(Linklist &L,int mink,int maxk)//删除元素递增排列的链表L中值大于mink且小于maxk的所有元素
{
  p=L;
  while(p->next->data<=mink) p=p->next; //p
是最后一个不大于mink的元素
  if(p->next)    //
如果还有比mink更大的元素
  {
    q=p->next;
    while(q->data<maxk) q=q->next; //q
是第一个不小于maxk的元素
    p->next=q;
  }
}//Delete_Between

3.  试写一算法,实现顺序表的就地逆置,即利用原表的存储空间,将线性表(a1,a2,a3,.........,an)逆置为(an,an-1,........a1).

 void reverse(SqList &A)//顺序表的就地逆置
{
  for(i=1,j=A.length;i<j;i++,j--)
    A.elem[i]<->A.elem[j];
}//reverse

4.  试写一算法,对单链表实现就地逆置。

 void LinkList_reverse(Linklist &L)//链表的就地逆置;为简化算法,假设表长大于2
{
  p=L->next;q=p->next;s=q->next;p->next=NULL;
  while(s->next)
  {
    q->next=p;p=q;
    q=s;s=s->next; //
L的元素逐个插入新表表头

  }
  q->next=p;s->next=q;L->next=s;
}//LinkList_reverse
分析:本算法的思想是,逐个地把L的当前元素q插入新的链表头部,p为新表表头.

5.  已知由一个线性链表表示的线性表中含有:类字符的数据元素(如:字母字符、数字字符和其他字符),试编写算法将该线性链表分割为三个循环链表,其中每个循环链表表示的线性表中均只含一类字符。

Status LinkList_Divide(LinkList &L,CiList &A,CiList &B,CiList &C)//把单链表L的元素按类型分为三个循环链表.CiList为带头结点的单循环链表类型.
{
  s=L->next;
  A=(CiList*)malloc(sizeof(CiLNode));p=A;
  B=(CiList*)malloc(sizeof(CiLNode));q=B;
  C=(CiList*)malloc(sizeof(CiLNode));r=C; //
建立头结点

  while(s)
  {
    if(isalphabet(s->data))
    {
      p->next=s;p=s;
    }
    else if(isdigit(s->data))
    {
      q->next=s;q=s;
    }
    else
    {
      r->next=s;r=s;
    }
  }//while
  p->next=A;q->next=B;r->next=C; //
完成循环链表
}//LinkList_Divide

 

  
原创粉丝点击