数据结构自测十题

1. 设顺序存储的线性表(如数组或向量)有n个元素,访问元素和随机增加、删除元素的时间复杂度分别为多少?(O(1)还是O(n)?)

O(1), O(n), O(n)

2. 设链表有n个元素,访问节点和随机增加、删除节点的时间复杂度分别为多少?(O(1)还是O(n)?)

O(n), O(1), O(1)

3、设一个有序的单链表中有n个结点,现要求插入一个新结点后使得单链表仍然保持有序,则该操作的时间复杂度为?(O(1)还是O(n)?)。

O(n)

5. 设有一个数组共享栈S[0:n-1],其中第一个栈顶指针top1的初值为-1,第二个栈顶指针top2的初值为n,则判断共享栈满的条件是?  

Top2=top1+1

6. 中缀表达式3+9/3^2+(2+3*3)的后缀表达式是?   

3932^/+233*++

7.  在一个单链表以HL为首节点的单链表中,若要向表头插入一个由指针p指向的节点,执行什么操作?

p->next=HL;HL=p

8. 设顺序循环队列Q[0:M-1]的头指针和尾指针分别为F和R,头指针F总是指向队头元素的前一位置,尾指针R总是指向队尾元素的当前位置,则该循环队列中的元素个数为?    

(R-F+M)%M

9.  下列函数执行什么功能?

template <typename T>

void function2(list<T> &aList)

{

	T currValue;

	list<T>::iterator curr, p;

	curr = aList.begin();

	while (curr != aList.end())

	{
		currValue = *curr;

		p = curr;
		p++;

		while (p != aList.end())

			if (*p == currValue)

				aList.erase(p++);

			else
				p++;

		curr++;
	}
}
   

功能:删除链表中重复元素

10 编程题:

编写一个子函数,依次读入无序数组中的数据,放进链表中,数组中的元素全部放入链表之后,链表中的元素为由小到大排列。最后返回该链表的首节点。(节点头文件已定义好)

如数组A为3, 7, 1, 2,, 9,则链表最后形成后,存储的依次是1, 2, 3, 7, 9。

节点头文件
template <typename T>
class node
{
public:
	T nodeValue;		// data held by the node
	node<T> *next;		// next node in the list
	node() : next(NULL) // 构造函数
	{
	}
	node(const T &item, node<T> *nextNode = NULL) : nodeValue(item), next(nextNode)
	{
	}
};


函数 
template <typename T>
node<T> *InputToList(T A[], int n) /// A表示数组,n表示数组元素个数
{
	node<T> *front = NULL;
	for (int m = 0; m < n; m++)
	{
		T avalue = A[m];
		node<T> *newnode = new node<T>(A[m]);
		node<T> *currentnode, *prevnode;
		if (m == 0) /// 添加第一个节点
		{
			front = newnode;
		}
		else // 添加第二个节点及其后面的所有节点
		{
			currentnode = front;
			prevnode = front;
			while (currentnode != NULL && newnode->nodeValue > currentnode->nodeValue)
			{
				prevnode = currentnode;
				currentnode = currentnode->next;
			}
			if (currentnode == front)
			{
				newnode->next = currentnode;
				front = newnode;
			}
			else
			{
				prevnode->next = newnode;
				newnode->next = currentnode;
			}
		}
	}
	return front;
}

时间复杂度分析:

一共有n个元素,每次元素放入有序链表中的平均时间复杂度为 m/2 (m是当前链表的元素个数),而m最大为n-1。因此时间复杂度为O(n^2)。当然也可以在当前数组中把元素先从小到大或从大到小排序好,再依次放入链表中,时间复杂度也是O(n^2)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
第一章概论 自测题答案 一、填空题 1. 数据结构是一门研究非数值计算的程序计问题中计算机的 操作对象 以及它们之间的 关系 和运算等的学科。 2. 数据结构被形式地定义为(D, R),其中D是 数据元素 的有限集合,R是D上的 关系 有限集合。 3. 数据结构包括数据的 逻辑结构 、数据的 存储结构 和数据的 运算 这三个方面的内容。 4. 数据结构按逻辑结构可分为两大类,它们分别是 线性结构 和 非线性结构 。 ....... 第2章 自测卷答案 一、填空 1. 【严题集2.2①】在顺序表中插入或删除个元素,需要平均移动 表中一半元素,具体移动的元素个数与 表长和该元素在表中的位置 有关。 2. 线性表中结点的集合是 有限 的,结点间的关系是 一对一 的。 3. 向一个长度为n的向量的第i个元素(1≤i≤n+1)之前插入一个元素时,需向后移动 n-i+1 个元素。 4. 向一个长度为n的向量中删除第i个元素(1≤i≤n)时,需向前移动 n-i 个元素。 5. 在顺序表中访问任意一结点的时间复杂度均为 O(1) ,因此,顺序表也称为 随机存取 的数据结构。 ....... 第8章 查找 自测卷 姓名 班级 一、填空题(每空1分,共10分) 1. 在数据的存放无规律而言的线性表中进行检索的最佳方法是 顺序查找(线性查找) 2. 线性有序表(a1,a2,a3,…,a256)是从小到大排列的,对一个给定的值k,用二分法检索表中与k相等的元素,在查找不成功的情况下,最多需要检索 8 次。有100个结点,用二分法查找时,最大比较次数是 7 。 3. 假在有序线性表a[20]上进行折半查找,则比较一次查找成功的结点数为1;比较两次查找成功的结点数为 2 ;比较四次查找成功的结点数为 8 ;平均查找长度为 3.7 。解: 显然,平均查找长度= O(log 2 n) <5次(2 5 )。但具体是多少次,则不应当按照公式来计算( 即( 21×log 2 21)/20=4.6次并不正确! )。因为这是在假 n=2 m -1的情况下推导出来的公式。应当用穷举法罗列全部元素的查找次数为=( 1+2×2+4×3+8×4+5×5)=74; ASL=74/20=3.7 !!! 4. 折半查找有序表(4,6,12,20,28,38,50,70,88,100),若查找表中元素20,它将依次与表中元素 28. 6. 12 .20 比较大小。 .........
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值