数据结构期末考试复习--1

算法设计题汇总

one

统计出单链表中节点的值等于给定的值 X 的节点数

int Count(LNode *HL,ElemType x){
	int i = 0;
	LNode *p = HL;
	while(p!=NULL){
		if (P->data==x)
		{
			i++;
		}
		p=p->next;
	}
	return i;
}

two

排序:将一组无序的数划分成两部分呢,前一部分均小于 k,后一部分均大于 k(快速排序的一趟)

void quickpass(int r[],int s,int t){
	int i = s,j = t, x = r[s];
	while(i<j){
		while(i<j&&r[j]>x) j = j-1;
		if(i<j){
			r[i] = r[j];
			j = j+1;
		}
		while(i<j&&r[i]<x) i =i+1;
		if(i<j){
			r[j] = r[i];
			j = j-1;
		}
	}
	r[i] = x;
}

链表求两个集合的交集

typedef struct node
{
	int data;
	struct node *next;
}lklist;

void intersection(lklist *ha ,lklist *hb, lklist *&hc){
	lklist *p,*q,*s;
	for (p = ha,hc = 0;p!=0;p=p->next)
	{
		for(q = hb;q!=0;q = q->next){
			if(q->data==p->data) break;
		}
		if(q!=0){
			t = (lklist *)malloc(sizeof(lklist));
			t->data = p->data;
			t->next = hc;
			hc = t;
		}
	}
}

three

设计在单链表中删除相同的多余节点的算法

typedef int datatype;
typedef struct node
{
	datatype data;
	struct node *next;
}lklist;
void delredundant(lklist *&head)
{
	lklist *p,*q,*s;
	for(p = head;p!=0;p=p->next)
	{
		for(q=p->next,s=q;q!=0)
		if(q->data==p->data)
		{
			s->next=q->next;
			free(q);
			q=s->next;
		}else{
			s=q;
			q=q->next;
		}
	}
}

设计求节点x在二叉树中的双亲节点的算法

typedef struct node
{
	datatype data;
	struct node *lchild,*rchild;	
}bitree;
bitree *q[20];
int r=0,f=0,flag=0;
void preorder(bitree *bt,char x)
{
	if(bt!=0&&flag==0)
		if(bt->data==x)
		{
			flag=1;
			return;
		}else{
			r=(r+1)%20;
			q[r] = bt;
			preorder(bt->lchild);
			preorder(bt->rchild);
		}
}
void parent(bitree *bt,char x)
{
	int i;
	preorder(bt ,x);
	for(i=f+1;i<=r;i++)
	{
		if(q[i]->lchild->data==x||q[i]->rchild->data) break;
	}
	if(flag==0) cout<<"not found
";
	else if(i<=r) cout<<bt->dataendl;
	else cout<<"not parent
";
}

four

链表分类存储(统计结果分别存入三个链表中)

typedef char datatype;
typedef struct node
{
	datatype data;
	struct node *next;
}lklist;

void split(lklist *head,lklist *&ha,lklist *&hb,lklist *&hc)
{
	lklist *p;ha=0,hb=0,hc=0;
	for(p=head;p!=0;p=head)
	{
		head = p->next;
		p->next=0;
		if(p->data>='A'&&p->data<='Z')
		{
			p->next = ha;ha = p;
		}else if(p->data>='0'&&p->data<='9'){
					p->next=hb;
					hb=p;
		}else{
			p->next=hc;
			hc=p;
		}
	}
}

设计链表实现交换左右子树

typedef struct node
{
	int data;
	struct node *lchild,*rchild;
}bitree;
void swapbitree(bitree *bt)
{
	bitree *p;
	if(bt == 0) return;
	swapbitree(bt->lchild);
	swapbitree(bt->rchild);
	p=bt->lchild;
	bt->lchild = bt->rchild;
	bt->rchild = p;
}

链表实现建立二叉树

#define n 10
typedef struct node
{
	int key;
	struct node *lchild,*rchild;
}bitree;

void bstinsert(bitree *&bt,int key)
{
	if(bt==0)
	{
		bt=(bitree *)malloc(sizeof(bitree));
		bt->key = key;
		bt->lchild = bt->rchild=0;
	}else if(bt->key>key){
			bstinsert(bt->lchild,key)
	}else{
		bstinsert(bt->rchild,key);
	}
}
void createbsttree(bitree *&bt)
{
	int i;
	for (int i = 0; i <= n; ++i)
	{
		bstinsert(bt,random(100));
	}
}

five

判断两个二叉树是否相同

typedef struct node
{
	datatype data;
	struct node *lchild,*rchild;
}bitree;
int judgebitree(bitree *bt1,bitree *bt2)
{
	if(bt1==0&&bt2==0) return 1;
	else if(bt1==0||bt2==0||bt1->data!=bt2->data)
	{
		return 0;
	}else return(judgebitree(bt1->lchild,bt2->lchild)*judgebitree(bt1->rchild,bt2->rchild))
}

两个有序单链表的合并算法

void mergelklist(lklist *ha,lklist *hb,lklist *&hc)
{
	lklist *s = hc = 0;
	while(ha!=0&&hb!=0)
	{
		if(ha->data<hb->data)
		{
			if(s==0) hc = s = ha;
			else{
				s->next = ha;
				s=ha;
			}
			ha=ha->next;
		}else{
			if(s==0) hc = s = hb;
			else{
				s->next = hb;
				s = hb;
			}
			hb = hb->next;
		}
		if(ha==0) s->next = hb;
		else s->next = ha;
	}
}
原文地址:https://www.cnblogs.com/ygjzs/p/12149444.html