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;
    	}
    }
    
  • 相关阅读:
    sax解析xml案例二
    mysql之删除重复数据
    Android之Intent探究
    struts2之Action名称的搜索顺序
    struts2自定义拦截器二——模拟session超时的处理
    struts2之防止表单重复提交
    Android之日期及时间选择对话框
    sax解析xml案例一
    Android之单选按钮对话框
    查询修改nls_database_parameters系统配置
  • 原文地址:https://www.cnblogs.com/ygjzs/p/12149444.html
Copyright © 2011-2022 走看看