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;
2.试写一算法,实现顺序表的就地逆置,即利用原表的存储空间将线性表(a1,a2,…,an)逆置为(an,an-1,…,a1)。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; }
实现下列函数:
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; } }
链表的一些题目
最新推荐文章于 2024-08-03 17:27:59 发布