数据结构期末考试复习--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\n";
    else if(i<=r) cout<<bt->dataendl;
    else cout<<"not parent\n";
}

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;
    }
}

猜你喜欢

转载自www.cnblogs.com/ygjzs/p/12149444.html