//1.
//
int CountX(LNode* HL,ElemType x){
int i = 0 ; LNode *p = HL;
while(p!=NULL)
{
if(P->data==x) i++;
p=p->next;
}//while,出循环时i中的值即为x结点个数
return i;
} //CountX
//2.
//将一组初始记录关键字序列表在O(n)时间复杂度内将线性表分为两部分
//左半部分均小于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]; i=i+1;}
while(i<j && r[j]<x) i=i+1 ; if(i<j){r[j]=r[i]; j=j-1;}
}
r[i]=x;
}
//3.
//设有两个集合A B,要求设计生成集合C=A ∩B
//ABC用链式存储结构表示
typedef struct node {
int data;
struct node *next;
}lklist;
void intersection(lklist *ha,llklist *hb,klist *&hc)
{
lklist *p,*q,*t;
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;
}
}
}
//4.
//设计在单链表中删除相同的多余的结点的算法
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;
}
}
}
//5.
//求结点x在二叉树中的双亲结点算法
typedef struct node{
datatype data;
struct node *lchild,*rchild;
}bitree;
bitree *q[20];
int r=0,f=0,flag=0;
void preoder(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,x);
preorder(bt->rchild,x);
}
}
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)
printf("not found x\n");
else if(i<=r)
printf("%c",bt->data);
else printf("not parent");
}
数据结构代码练习01
于 2024-01-16 12:56:28 首次发布