数据结构第二版(朱昌杰版)习题2答案

单选题
1-10 acadb,dbdab
难点简述:就第一题需要说明一下,直接特殊值参考,n-1,就很过分了,当n=1时,是不是就不需要比较了?so,A
算法设计题:
1、求一个不带头节点的单了表中的节点个数

int countNode(LinkList L){
	int count=0;
	LNode *p=L;
	while(p!=NULL){
		count++;
		p=p->next;
	}
	return count;
}

秒杀
2、求一个带头节点的单链表中的节点个数(忍住,这是多鄙视)

int countNode(LinkList L){
	int count=0;
	LNode *p=L->next;
	while(p!=NULL){
		count++;
		p=p->next;
	}
	return count;
}

3、在一个单链表中的值为Y的节点前面插入一个值为X的节点,即使值为X为新节点成为Y节点的前驱节点

void insertY(LinlList L,int Y,int X){
	LNode *p=L->next,*q;
	LNode *k=(LinKlList)malloc(sizeof(LNode));
	k->data=X;
	while(p->data==Y){
		q=p;
		p-=p->next;
	}
	if(p->data==Y) q->next=k; k->next=p;
}

4、设计一个顺序表中的各个结点值是否有序,判断有序或者,可以直接判断,第一个结点和后面对比是不是最大或者对小,然后继续往后面移动,算法时间复杂度大概为n^2;

void isSort(LinklList L){
	LNode *p,*q;
	p=L->next;
	while(p==NULL){
		while(q==NULL){
			if(p->data<q->data){
				printf("The LinkList haven't  sorted! ");
				return ;
			}
			q=q->next;
		}
		p=p->next;
		q=p->next;
	}
}

5、利用单链表原来的结点空间将一个单链表进行就地逆转(我的blog里面有写过的,可以直接参考,这里是没有经过编译器编译的,纯手写)

void reverseLinkList(LinkList L){
	LNode *p,*q;
	p=L->next;
	L->next=NULL;
	while(p!=NULL){
		q=p;
		p=p->next;
		q->next=L->next;
		L->next=q;
	}
}

6、将一个链表里面的偶数留下,奇数给另一个链表且保持原来的顺序:
解法:直接一层判断,插入,代码就不贴了;
7、删除所有大于X和小于Y的值;
解法:关键是留p指向前一个q,进行删除操作;q-next=p->next; over
8.插入一个数值为X,到递减的一个链表里面:
直接一层循环,判断P->data>X;p->next->next<X;就将X插入到P后面
OVER;
9.删除重复值在某链表中
循环做while(){}
p和q;解决;

10、单链表的排序
在这里插入图片描述欧耶,这个结束
11、两个有序链表合并(easy)
指针后移++,就是这样dei
q、p、k;
12、两层循环,拿出重复的值或者两个while
13、双链表、插入,直接进入后继和前驱
14、设计一个从右往左打印双向链表

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页