判断题

1、链表的每个结点都恰好有一个指针。F

单链表有一个指针,用来指向下一个结点,双链表有两个指针,用来指向直接前驱和直接后继。

其实我觉得吧,想放几个指针不就放几个,高兴怎么用就怎么用。

2、链式存储的优点是插入、删除元素时不会引起后续元素的移动,缺点是只能顺序访问各元素。T

链式存储是依靠结点内的指针,通过指针的指向实现的逻辑上的相连,并非物理上的相连,再插入和删除的时候仅仅需要更改指针的指向,便可实现结点的插入。

3、在一个设有头指针和尾指针的单链表中,执行删除该单链表中最后一个元素的操作与链表的长度无关。F

删除最后一个元素的操作需要知道他的前驱结点,而单链表是无法通过尾指针找到最后一个元素的前驱结点的,所以依旧需要从头指针遍历到最后一个元素的前一个,所以该操作与链表的长度是有关的。

4、If N numbers are stored in a doubly linked list in increasing order, then the average time complexity for binary search is O(logN).F

如果N个数字以递增的顺序存储在一个双链表中,那么二进制搜索的平均时间复杂度为O(logN)。

binary search:对分查找;二进位检索;折半查找法;二分搜寻

链表是不能使用折半查找的,在顺序表中折半查找的时间复杂度是O(logN)

5、线性表若采用链式存储结构时,要求内存中可用存储单元的地址一定不连续。F

不一定连续

选择题

1、在具有N个结点的单链表中,实现下列哪个操作,其算法的时间复杂度是O(N)?

A、在地址为p的结点之后插入一个结点

B、删除开始结点

C、遍历链表和求链表的第i个结点

D、删除地址为p的结点的后继结点

2、在双向循环链表结点p之后插入s的语句是:

A.p->next=s; s->prior=p; p->next->prior=s ; s->next=p->next;

B.p->next->prior=s; p->next=s; s->prior=p; s->next=p->next;

C.s->prior=p; s->next=p->next; p->next=s; p->next->prior=s;

D.s->prior=p; s->next=p->next; p->next->prior=s; p->next=s;

3、If the most commonly used operations are to insert a new element after the last element, and to delete the first element in a linear list, then which of the following data structures is the most efficient?

A.singly linked list

B.singly linked circular list with a tail pointer

C.singly linked circular list with a head pointer

D.doubly linked list

4、If the most commonly used operations are to insert a new element after the last element, and to delete the last element in a linear list, then which of the following data structures is the most efficient?

A.singly linked list

B.doubly linked list

C.singly linked circular list

D.doubly linked circular list with a dummy head node

5、For two linear lists La and Lb, to link the tail of La with the head of Lb, with which one of the following data structures that we can take O(1) time and minimize the extra space?

A.singly linked list

B.singly linked circular list

C.singly linked circular list with a tail pointer

D.doubly linked circular list with a dummy head node

6、线性表若采用链式存储结构时,要求内存中可用存储单元的地址()。

A.必须是连续的

B.部分地址必须是连续的

C.一定是不连续的

D.连续或不连续都可以

7、与单链表相比,双链表的优点之一是()。

A.插入、删除操作更加简单

B.可随机访问

C.可以省略表头指针或表尾指针

D.顺序访问相邻结点更加灵活

8、可以用带表头附加结点的链表表示线性表,也可以用不带头结点的链表表示线性表,前者最主要的好处是()。

A.可以加快对表的遍历

B.使空表和非空表的处理统一

C.节省存储空间

若使用头结点,无论表是否为空,头指针都指向头结点,也就是*LNode类型,对于空表和非空表的操作是一致的。

若不使用头结点,当表非空时,头指针指向第1个结点的地址,即*LNode类型,但是对于空表,头指针指向的是NULL,此时空表和非空表的操作是不一致的。

D.可以提高存取表元素的速度

9、以下关于链式存储结构的叙述中,()是不正确的。

A.结点除自身信息外还包括指针域,因此存储密度小于顺序存储结构

B.逻辑上相邻的结点物理上不必邻接

C.可以通过计算直接确定第i个结点的存储地址

D.插入、删除运算操作方便,不必移动结点

顺序存储可以通过计算直接确定第i个元素的存储地址

10、循环链表的主要优点是()。

A.不再需要头指针了

B.已知某个结点的位置后,能够很容易找到它的直接前驱

C.在进行插入、删除运算时,能更好的保证链表不断开

D.从表中的任意结点出发都能扫描到整个链表

11、单链表的每个结点中包括一个指针next,它指向该结点的后继结点。现要将指针q指向的新结点插入到指针p指向的单链表结点之后,下面的操作序列中()是正确的。

A.q=p->next; p->next =q->next;

B.p->next =q->next; q=p->next;

C.q->next =p->next; p->next=q;

D.p->next =q; q-> next=p->next;

12、阅读下列程序,该算法的功能是()。

typedef struct node{ElemType data;struct node *next;
}LNode;
void fun2(LNode *&h){
LNode *p, *q, *r;if (h==NULL) return;p=h;q=h->next;while (q!=h ){r=q->next;q->next=p;p=q;q=r;}h->next=p;h=p;
}

A.将单链表逆置

B.将单循环链表逆置

C.从头到尾遍历单链表

D.从头到尾遍历单循环链表

13、在循环双链表的p所指结点之前插入s所指结点的操作是()。

A.p->prior = s; s->next = p; p->prior->next = s; s->prior = p->prior;

B.p->prior = s; p->prior->next = s; s->next = p; s->prior = p->prior;

C.s->next = p; s->prior = p->prior; p->prior = s; p->right->next = s;

D.s->next = p; s->prior = p->prior; p->prior->next = s; p->prior = s;

14、如果对线性表的运算只有2种,即删除第一个元素,在最后一个元素的后面插入新元素,则最好使用()。

A.只有表头指针没有表尾指针的循环单链表

B.只有表尾指针没有表头指针的循环单链表

C.非循环双链表

D.循环双链表

15、设有两个长度为n的单链表,结点类型相同。若以h1为表头指针的链表是非循环的,以h2为表头指针的链表是循环的,则()。

A.对于两个链表来说,删除第一个结点的操作,其时间复杂度都是O(1)

B.对于两个链表来说,删除最后一个结点的操作,其时间复杂度都是O(n)

C.循环链表要比非循环链表占用更多的内存空间

D.h1和h2是不同类型的变量

16、从一个具有n个结点的有序单链表中查找其值等于x的结点时,在查找成功的情况下,需要平均比较( )个结点。

A.n

B.n/2

C.(n-1)/2

D.(n+1)/2

x的位置可以是1,2,3……N中任意位置,有N种可能,即需要比较1,2,3……N次,总共比较

n(n+1)/2次,除以 N 种可能 即为答案。

17、单链表中,增加一个头结点的目的是( )。

A.使单链表至少有一个结点。

B.标识表结点中首结点的位置。

C.方便运算的实现。

D.说明单链表是线性表的链式存储。

编程题

6-1 单链表逆转 (20 分)

本题要求实现一个函数,将给定的单链表逆转。

函数接口定义:

List Reverse( List L );

其中List结构定义如下:

typedef struct Node *PtrToNode;
struct Node {ElementType Data; /* 存储结点数据 */PtrToNode   Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */

L是给定单链表,函数Reverse要返回被逆转后的链表。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {ElementType Data;PtrToNode   Next;
};
typedef PtrToNode List;List Read(); /* 细节在此不表 */
void Print( List L ); /* 细节在此不表 */List Reverse( List L );int main()
{List L1, L2;L1 = Read();L2 = Reverse(L1);Print(L1);Print(L2);return 0;
}/* 你的代码将被嵌在这里 */

输入样例:

5
1 3 4 5 2

输出样例:

1
2 5 4 3 1
List Reverse(List L)
{if (L == NULL) return;List p, r;p = NULL;r = NULL;//逐个将结点提到第一个//1 2 3 4 5//2 1 3 4 5//3 2 1 4 5//4 3 2 1 5//5 4 3 2 1while (L!=NULL)//判断是否是最后一个{r = L->Next;//如果是最后一个 此时r=NULL;L->Next = p;//当前结点连在上一个结点前方  两个结点逆置p = L;//逆置后的第一个为pL = r;//q = NULL
/*
第一次、r=2,1结点的next指NULL, p=1, L=2
第二次、r=3, 2结点的next指1,    p=2, L=3
第三次,r=4,3结点的next指2,    p=3,L=4
第四次、r=5,4结点的next指3,    p=4,L=5
第五次、r=NULL,5结点的next指4, p=5,L=NULL
*/}//L->Next = p;//此时L指针指的地址已经被换到了最后一个 p为第一个 首尾相连//将L指针重新指向变换后的链表的头结点return p;
}
//开头多一个List q=L,循环里L换成q,然后再加上后边的L->next=p的话,
//似乎就是循环链表的逆置了,不过while里的判断要改为q.next != L
//懒得想了,上边选择题有一道就是循环单链表的逆置

6-2 求链式表的表长 (10 分)

本题要求实现一个函数,求链式表的表长。

函数接口定义:

int Length( List L );

其中List结构定义如下:

typedef struct LNode *PtrToLNode;
struct LNode {ElementType Data;PtrToLNode Next;
};
typedef PtrToLNode List;

L是给定单链表,函数Length要返回链式表的长度。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>typedef int ElementType;
typedef struct LNode *PtrToLNode;
struct LNode {ElementType Data;PtrToLNode Next;
};
typedef PtrToLNode List;List Read(); /* 细节在此不表 */int Length( List L );int main()
{List L = Read();printf("%d\n", Length(L));return 0;
}/* 你的代码将被嵌在这里 */

输入样例:

1 3 4 5 2 -1

输出样例:

5
int Length(List L)
{int n = 0;while (L != NULL){n++;L = L->Next;}return n;
}

6-3 删除单链表偶数节点 (20 分)

本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中偶数值的结点删除。链表结点定义如下:

struct ListNode {int data;struct ListNode *next;
};

函数接口定义:

struct ListNode *createlist();
struct ListNode *deleteeven( struct ListNode *head );

函数createlist从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。

函数deleteeven将单链表head中偶数值的结点删除,返回结果链表的头指针。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>struct ListNode {int data;struct ListNode *next;
};struct ListNode *createlist();
struct ListNode *deleteeven( struct ListNode *head );
void printlist( struct ListNode *head )
{struct ListNode *p = head;while (p) {printf("%d ", p->data);p = p->next;}printf("\n");
}int main()
{struct ListNode *head;head = createlist();head = deleteeven(head);printlist(head);return 0;
}/* 你的代码将被嵌在这里 */

输入样例:

1 2 2 3 4 5 6 7 -1

输出样例:

1 3 5 7 
struct ListNode* createlist() {int data;struct ListNode* head, * pre;head = pre = NULL;scanf("%d", &data);while (data != -1) {struct ListNode* a = (struct ListNode*)malloc(sizeof(struct ListNode));if (a != NULL){a->data = data;a->next = NULL;}if (head == NULL) {head = a;pre = a;}else {pre->next = a;pre = a;}scanf("%d", &data);if (data == -1)break;}return head;
}
struct ListNode* deleteeven(struct ListNode* head) {struct ListNode* store, * i;//一个存上一个的地址,一个过度。int flag = 0;store = NULL;for (i = head; i != NULL;) {if ((i->data) % 2 == 0) {if (i == head) {store = i;head = head->next;i = head;free(store);continue;}if (i->next != NULL) {store->next = i->next;i = store->next;flag = 0;continue;}else if (i->next == NULL) {store->next = NULL;break;}}else {store = i;i = i->next;}}return head;
}

(PTA)数据结构(作业)4、链表相关推荐

  1. 数据结构作业5--单链表(判断题)

    1-1在具有N个结点的单链表中,访问结点和增加结点的时间复杂度分别对应为O(1)和O(N). (1分) T F 作者: DS课程组 单位: 浙江大学 1-2将长度分别为m,n的两个单链表合并为一个单链 ...

  2. 【数据结构作业—01】用单循环链表解决约瑟夫问题

    实验作业一:线性表(链表) 1. 用单循环链表解决约瑟夫问题. 问题描述: 一个旅行社要从n个旅客中选出一名旅客,为他提供免费的环球旅行服务.旅行社安排这些旅客围成一个圆圈,从帽子中取出一张纸条,用上 ...

  3. PTA实验作业-01

    一.PTA实验作业 本周要求挑3道题目写设计思路.调试过程.设计思路用伪代码描述.题目选做要求: 顺序表选择一题(6-2,6-3,7-1选一题),代码必须用顺序结构抽象数据类型封装 单链表选择一题(6 ...

  4. 数据结构作业之输出树的每一条从根节点到叶节点的路径

    数据结构作业,输出树的每一条从根节点到叶节点的路径 #include <stdio.h> #include <stdlib.h> typedef struct tree {ch ...

  5. MOOC浙大数据结构课后题记录——PTA数据结构题目集(全)

    目录 第一周--最大子列和算法.二分查找 01-复杂度1 最大子列和问题 (20分) 01-复杂度2 Maximum Subsequence Sum (25分) 01-复杂度3 二分查找 (20分) ...

  6. PTA数据结构与算法题目集6-4 6-3 6-8

    PTA数据结构与算法题目集(中文) 6-4 链式表的按序号查找 ElementType FindKth( List L, int K ){int index = 0;while(L){++index; ...

  7. PTA数据结构与算法题目集 6-9 二叉树的遍历

    PTA数据结构与算法题目集(中文) 6-9 二叉树的遍历 void InorderTraversal( BinTree BT ){if(BT==NULL)return;if(BT->Left){ ...

  8. 数据结构实验之链表五:单链表的拆分-sdut

    数据结构实验之链表五:单链表的拆分 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 输入N个 ...

  9. SDUT_2122 数据结构实验之链表七:单链表中重复元素的删除

    提交代码 数据结构实验之链表七:单链表中重复元素的删除 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Proble ...

  10. SDUT—2054数据结构实验之链表九:双向链表 (基本建立)

    点击打开链接 数据结构实验之链表九:双向链表 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Des ...

最新文章

  1. 1至m为PQ节点,m+1至n-1为PV节点,n为平衡节点
  2. 灰鸽子病毒手工清除方法
  3. a*算法的优缺点_K-近邻算法以及案例
  4. 如何在Linux上运行Windows软件?
  5. 学python能赚钱吗-哪种Python程序员最赚钱?爬虫数据告诉你!
  6. Fastdfs(1)安装之Tracker
  7. sm专用计算机是啥意思,计算机CPU的主频代表的是什么意思
  8. 监督和无监督、分类和回归算法总结
  9. react中prop-types的使用
  10. 大气化学实验卫星 ACE-FTS(SCISAT) 相关介绍
  11. importOrder
  12. 记录机器学习练习中不懂的函数
  13. android 6.0 SystemUI源码分析(1)-SystemUI介绍
  14. 【网络hcip】ospf学习 总结
  15. 【转载】传统蓝牙协议栈 串口协议SPP
  16. 调制 Modulation
  17. 网盘行业No1 金山快盘个人版推出永久免费100G空间
  18. 不积跬步无以至千里,不积小流无以成江海----SAX读取xml
  19. 橱柜高度与身高对照表_橱柜高度和尺寸如何制定?看这里就对了!
  20. h5 页面 唤起手机拨号功能

热门文章

  1. 《算法技术手册》一1.3.5 融会贯通
  2. linux mysql常用基本操作,Linux下MySQL数据库常用基本操作 一
  3. 时间间隔感测试器(下):Arduino uno
  4. python中的请求方法_Python爬虫HTPP请求方法有哪些
  5. Hark的数据结构与算法练习之冒泡排序
  6. Unity ios打包卡在Converting managed assemblies to C++
  7. PDF软件最新版本功能介绍
  8. 查看https 安全证书信息
  9. 【Practical】共轭
  10. hololens2 通信 之 Windows.Networking.Sockets