统计单链表中结点值等于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;
}