链表的一些题目
来源:互联网 发布:怪物猎人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
- 链表的一些题目
- 大一的一些题目
- 一些有趣的题目
- 一些经典的题目
- 常见的一些题目
- 搜集的一些题目
- 笔试的一些题目 .
- android 的一些题目
- 一些题目的题解
- JavaScript的一些题目
- 软件工程的一些题目
- 一些有趣的题目
- 笔试的一些题目
- 笔试的一些题目
- 一些网上的题目
- 一些好玩的题目
- 一些JAVA面试的题目吧一些记住的题目
- 收藏的一些面试题目
- 创建省级级联
- c3p0和QueryRunner的结合使用,让开发更加简便
- Nginx服务器架构简析
- tcpdump抓包
- 排序算法:插入排序
- 链表的一些题目
- C++一步一步实现二叉搜索树
- android 短信的接收和发送处理
- windows如何配置java和maven?
- IOS自定义NSLOG和断言的使用/description方法的使用原理(对象,数组,字典)
- 算法与数据结构前绪
- 微信/支付宝支付js
- 欢迎使用CSDN-markdown编辑器
- 鸟哥的linux私房菜学习笔记《二十五》账号管理