链表的一些题目

1.已知指针la和lb分别指向两个无头结点单链表中的首元结点。 下列算法是从表la中删除自第i个元素起共len个元素后,将它们插入到表lb中第i个元素之前。试问此算法是否正确? 若有错,则请改正之。实现下列函数:Status DeleteAndInsertSub(LinkList &la, LinkList &lb,                          int i, int j, int len);// la和lb分别指向两个单链表中第一个结点,        *//* 本算法是从la表中删去自第i个元素起共len个元素,*//* 并将它们插入到lb表中第j个元素之前,           *//* 若lb表中只有j-1个元素,则插在表尾。           */单链表类型定义如下:typedef struct LNode{    ElemType      data;    struct LNode *next;} LNode, *LinkList;
Status DeleteAndInsertSub(LinkList &la, LinkList &lb,int i, int j, int len){   
   // 只考虑la的长度大于i+len,以及j小于lb的长度下
   LinkList pa1,pa2;
   pa1=la->next;
   int pos=1;
   while(pos<i) pa1=pa1->next;
   pa2=pa1;
   pos=0
   while(pos<len) {pa2=pa2->next; ++pos;}
   pa1->next=pa2->next;
   pa2=la->next;     //pa1指向裁剪后的链表
   LinkList pb;
   pb=lb;
   pos=1;
   while(pos<j)  {pb=pb->next;  ++pb;}
   pa1->next=pb->next;
   pb->next=pa1;
}
2.试写一算法,实现顺序表的就地逆置,即利用原表的存储空间将线性表(a1,a2,…,an)逆置为(an,an-1,…,a1)。
实现下列函数:
void Inverse(SqList &L);
顺序表类型定义如下:
typedef struct {
    ElemType *elem;
    int       length;
    int       listsize;

} SqList;

void Inverse(SqList &L)
{
    int i=0;
    int j=L.length;
    Elemtype tmp;
    while(i<j){
       tmp=elem[i];
       elem[i]=elem[j-1];
       elem[j-1]=tmp;
       ++i;
       --j;
    }
}

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

实现下列函数:
void Inverse(LinkList &L);
/* 对带头结点的单链表L实现就地逆置 */

单链表类型定义如下:
typedef struct LNode{
    ElemType      data;
    struct LNode *next;
} LNode, *LinkList;
void Inverse(LinkList &L) 
/* 对带头结点的单链表L实现就地逆置 */
{
   int i=0;
   int j,pos;
   int len=0;   
   ElemType tmp;
   LinkList pa,pb;
   pa=L->next;
   while(pa!=NULL){             //求链表长度
     pa=pa->next;
     ++len;
   }
   j=len-1;
   pa=L->next;
   while(i<j){
      pos=0;
      pb=L->next;
      while(pos<j){
        pb=pb->next;
        ++pos;
      }
      tmp=pa->data;
      pa->data=pb->data;
      pb->date=tmp;
      ++i;
      --j;
      pa=pa->next;
   }   
}

4.假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并成一个按元素值递减有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C, 并要求利用原表(即A表和B表)的结点空间构造C表。

实现下列函数:
void Union(LinkList &lc, LinkList la, LinkList lb);
/* 依题意,利用la和lb原表的结点空间构造lc表 */

单链表类型定义如下:
typedef struct LNode{
    ElemType      data;
    struct LNode *next;
} LNode, *LinkList;
void Union(LinkList &lc, LinkList &la, LinkList &lb)
 LinkList pa, pb, pc;
    int lena=0, lenb=0;
    pa = la->next;
    pb = lb->next;
    pc = lc;
    int i,j;
    while(pa!=NULL){
        pa = pa->next;
        ++lena;
    }
    while (pb != NULL) {
        pb = pb->next;
        ++lenb;
    }
    int lenA = lena, lenB = lenb;
    while (lenA > 0 && lenB > 0) {
        pa = la->next;
        pb = lb->next;
        i = 1, j = 1;
        while (i < lenA) { pa = pa->next; ++i; }
        while (j < lenB) { pb = pb->next; ++j; }
        if (pa->num > pb->num) {
            pc->next = pa;
            --lenA;
            pc = pc->next;
        }
        else {
            pc->next = pb;
            --lenB;
            pc = pc->next;
        }
    }
    if (pa == pc) {      //将pb剩余的元素移到pc
        while (lenB > 0) {
            int i = 1;
            pb = lb->next;
            while (i < lenB) { pb = pb->next; ++i; }
            pc->next = pb;
            pc = pc->next;
            --lenB;
        }
        pc->next = NULL;
    }
    if (pb == pc) {
        while (lenA > 0) {          //将pa剩余的元素移到pc
            int i = 1;
            pa = la->next;
            while (i < lenA) {
                pa = pa->next; ++i;
            }
            pc->next = pa;
            pc = pc->next;
            --lenA;
        }
        pc->next = NULL;
    }
}

5.设以带头结点的双向循环链表表示的线性表L=(a1,a2,...,an)。试写一时间复杂度为 O(n)的算法,将L改造为L=(a1,a3,...,an,...,a4,a2)。

实现下列函数:
void ReverseEven(BiLinkList &L);

双向循环链表类型定义如下:
typedef struct BiNode {
    ElemType       data;
    int            freq; // 2.38题用
    struct BiNode *prev,
                  *next;
} BiNode, *BiLinkList;

void ReverseEven(BiLinkList &L)
{
    int pos = 0, len = 1;
    BiLinkList *p;
    p = L->next;
    while (p != L) { ++len; p = p->next; }   //得到链表长度
    int *a;
    a = (int *)malloc(len * sizeof(int));
    while (pos < len) {
        if (!(pos % 2)) {
            *(a + pos / 2) = p->Date;
            ++pos;
            p = p->next;
        }
        else {
            *(a + (len - 1 - pos / 2)) = p->Date;
            ++pos;
            p = p->next;
        }
    }
    pos = 0;
    p = L;
    while (pos < len) {
        p->Date = a[pos];
        p = p->next;
        ++pos;
    }
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值