链表的一些题目

来源:互联网 发布:怪物猎人ol mac能玩吗 编辑:程序博客网 时间:2024/06/08 04:30
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;    }}




0 0
原创粉丝点击