本人的一些思路可能会存在一些小错误,敬请指出
//在链式结构上实现 直接插入算法 "不带头节点"
/*
算法的总体思想 :
(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;
}
}
}