zoukankan      html  css  js  c++  java
  • 数据结构期末考试复习--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;
    	}
    }
    
  • 相关阅读:
    oracle 10g 免安装客户端在windows下配置
    sql2005 sa密码
    使用windows live writer 有感
    windows xp SNMP安装包提取
    汉化groove2007
    迁移SQL server 2005 Reporting Services到SQL server 2008 Reporting Services全程截图操作指南
    foxmail 6在使用中的问题
    AGPM客户端连接不上服务器解决一例
    SpringSource Tool Suite add CloudFoundry service
    Java 之 SWing
  • 原文地址:https://www.cnblogs.com/ygjzs/p/12149444.html
Copyright © 2011-2022 走看看