长沙理工大学850数据结构20年代码真题解析

本人的一些思路可能会存在一些小错误,敬请指出

//在链式结构上实现 直接插入算法 "不带头节点"
  /*
  算法的总体思想 :
  (1)q代表的是已经插入排序好的序列最后一个元素 p代表的是未插入排序的序列第一个元素
  (2)如果p结点的元素值大于q结点的元素值,直接插入到q结点的后面即可
  (3)如果p结点的值小于q结点的值,那么就用falg(指向排序好的第一个序列)从前往后找(flag=flg->next)
       找到第一个p结点的值小于等于flagd的值,然后插入进去 
  (4)为了下次寻找还能找到p->next后面的值,暂用q->next的值保存p->next; 
  */
  linklist* charu(linklist *head){
  	if(head==NULL){
  		return head;
	}
	  if(head->next==NULL){
	  	return head;
	} 
	linklst *q=head;
	linklist *p=head-next;
  	q->next=NULL;
  	while(p!==NULL){
  	if(p->data>q->data){
  		q->next=p;
  		q=p;
	}	
	else{
		linklist*flag=head;
		q->next=p->next;
		while(p->data>=flag->data){
			flag=flag->next;
		}
		p->next=flag->next;
	  	flag->next=p;
	  	p=q->next;
	}
	
	}
  	return head;
  } 
  
// 设计算法将无向图的邻接矩阵转换为对应的邻接表
  typedef struct ljjz{
  	int jz[100][100];
  	int bian,dingdian;  //矩阵的定义 
  }ljjz; 
  
 typedef struct bbjd{
 	int dingdian;           //边表结点的定义 
 	struct bbjd *next;
 }bianbiao;
  
  typedef struct tojiedian{
  	int dingdian;
  	bianbiao *first;         //头表结点的定义
  }tojiedian; 
  
  typedef struct linjiebiao{
  	  tojiedian tjd[10];          //邻接表的定义 
  	int bian,dingdian;        
  }linjiebiao;
  
  linjiebiao*change(ljjz * &ljjzA){
  	linjiebiao * ljb=malloc(sizeof(struct linjiebiao));
  	ljb->bian=ljjzA->bian;           //把原有的矩阵结点个数和边数都赋给新创建的邻接表 
  	ljb->dingdian=ljjzA->dingdian;
  	for(int i=0;i<n;i++){
  		ljb->first=NULL; 
	}
	for(int i=0;i<n;i++){
	  	for(int j=0;j<n;j++){
	  		   /*如果邻接矩阵该位置上的元素不等于零说明i和j之间 有边相连
				  创建一个新的边表节点,用头插法把它插入到以i为头节点的后面 
	  		   */ 
	  		if(ljjzA-jz[i][j]!=0){                     
	  		bianbiao *bb=malloc(sizeof(struct bbjd));
	  		bb->dingdian=j;
	  		bb->next=ljb->first;
	  		ljb->next=bb;
			}
		}
	}
	return ljb;
  } 
  
  //求结点双亲 
  Bitree findParent(Bitree *T,int x){
  	     if(T==NULL){
  	     	return T;
		   }
		   if(T->lchild==NULL&&T->Rchild==NULL){
		   	return NULL;
		   }
		   else{
		   	if(T->lchild!==NULL&&T->lchild->data==x){
		   		return T;
			   }
		    	if(T->Rchild!==NULL&&T->Rchild->data==x){
		   		return T;
			   }
			   Bitree*p=findParent(T->Lchild,x);
			   if(p!=NULL){
			   	return p;
			   }
			    Bitree*d=findParent(T->Rchild,x);
			   if(d!=NULL){
			   	return d;
			   	   return NULL;
			   }
		   }
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小宋加油啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值