数据结构十套卷

统计单链表中结点值等于x的结点个数

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

设计交集算法

LNode Common(LNode *A,LNode *B)
{
	LNode C=(LNode*)malloc(siezeof(LNode));
	C->next=NULL;
	LNode *p,*q,*s;
	p=A;
	Q=B;
	while(p!=NULL)
	{
		while(q!=NULL)
		{
			if(q->data==p->data)
				{
				s=(LNode*)malloc(sizeof(LNode));
				s->data=q->data;
				s->next=C->next;
				C->next=s;
				}
			q=q->next;
		}
		p=p->next;
	}
}

在O(n)时间内将线性表分为两半,左半边均小于k右半边均大于k

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

删除单链表中相同的多余结点

LNode Del(LNode *&L)
{
	LNode *p,*q,*s;
	p=L;
	while(p!=NULL)
	{
		q=p->next;
		while(q!=NULL)
		{
			if(q->data==p->data)
			{
				s=q;
				p->next=s->next;
				free(q);
				q=s->next;
			}
			else
			{
				s=q;
				q=q->next;
			}
		}
		p=p->next;
	}

}

求结点x在二叉树中的双亲结点

typedef struct BTNode
{
	int data;
	BTNode *lchild;
	BTNode *rchild;
}BTNode;
BTNode *q[20];
int r=0,f=0,flag=0
void preorder(BTNode *bt,char x)
{
	if(bt!=NULL&&flag==0)
	{
		if(bt->data==x)
		{
			flag=1;
			return ;			
		}
		else
		{
			r=(r+1)%20;
			q[r]=bt;
			preorder(bt->lchild,x);
			preorder(bt->rchild,x);
		}
	}
}
void parent(BTNode *bt,char x)
{
	int i;
	preorder(bt,x);
	for(i=f+1;i<=r;i++)
		if(a[i]->lchild->data==x||q[i]->rchild->data)
			break;
		if(flag==0)
			printf("未找到x");
		else if(i<=r)
		printf("%c",bt->data);
		else printf("无父结点")
}

单链表中有三类字符 大写字母、数字和其他类字符,设计出三个单链表将其归类

Sort(LNode *L)
{
	LNode *LA,*LB,*LC;
	LNode *p,*q,*r,*s;
	//p用来遍历主链 q、r、s分别用于字母组、数字组、其他组接收新结点
	q=LA->next;//字母组
	r=LB->next;//数字组
	s=LC->next;//其他组
	p=L->next;
	while(p)
	{
		if(p->data>='A'&&p->data<='Z')
		{
			q=p;
			q->next=LA->next;
			LA->next=q;
		}
		else if(p->data>='0'&&p->data<='9')
		{
			r=p;
			r->next=LB->next;
			LB->next=r;
		}
		else
		{
			s=p;
			s->next=LC->next;
			LC->next=s;
		}
		p=p->next;			
	}
}

交换二叉树中左右子树

void swap(BTNode *&bt)
{
	BTNode *p;
	if(bt==NULL)
	return;
	swap(bt->lchild);
	swap(bt->rchild);
	p=bt->lchild;
	bt->lchild=bt->rchild;
	bt->rchild=p;	
}

建立二叉排序树

void T(BTNode *&bt,int key)
{
	if(bt==NULL)
	{
		bt=(BTNode*)malloc(sizeof(BTNode));
		bt->data=key;
		bt->lchild=bt->rchild=NULL;
	}
	else if(bt->data>key)
		T(bt->lchild,key);
	else
		T(bt->rchild,key);
}
void createT(BTNode *&bt,int n)
{
	int x;
	for(int i=1;i<n;i++)
		{
		printf("%d",x);
		T(bt,x);
		}
}

判断两棵二叉树是否相同

int Judge(BTNode *a,BTNode *b)
{
	if(a==NULL&&b==NULL)
		return 1;
	else if(a==NULL||b=NULL||a->data!=b->data)
		return 0;
	else
		return(Judge(a->lchild,b->lchild)*Judge(a->rchild,b->rchild));
}
//递增排序 删除所有大于x小于y的元素
LNode del(LNode *&L)
{
LNode *p,*q,*r;
p=L;//带头结点
q=p->next;//p指向pre,q指向待删除元素
while(q&&q->data<=x)
	{
		q=q->next;
		p=p->next;
	}//p指向最后一个不用删除的结点,q指向第一个要删除的节点
while(q&&q->data<y)
	q=q->next;	//q指向第一个不用删除的节点	
//释放所有该删除的结点空间
while(p->next!=q)
{
	r=p->next;
	p->next=r->next;
	free(r);	
}
return L;
}
上一篇:数据结构学习


下一篇:单链表指定位置前插