南航829计算机考研C/C++代码:链表交集与逆序

4 篇文章 0 订阅
1 篇文章 0 订阅

一、题目

(2013年 829)已知有两个带头结点的单链表A和B,元素值递增有序,编写函数,调整删减A链表,使A链表结点元素值为A、B的交集,并成为一个递减有序的单链表。要求先给出思想算法,再写出相应代码。

二、代码

LinkList.h:

#include<stdio.h>

#define     ElemType    int
#define     Status           int
#define     OK                  0
#define     False             1

/*
define struct LNode
*/
typedef struct  LNode  {
    ElemType  data;
    struct         LNode  *next;
} LNode, *LinkList;

/*
init list
*/
Status InitList( LinkList  &L )
{
    L  =  new LNode;
    L->next = NULL;
    printf("InitList successful !\n");
    return OK;
}

/*
add a new node after list
*/
Status CreateNode(LinkList &L)
{
    LNode *q, *p;
    p = L;
    while(p->next != NULL)
    {
        p = p->next;
    }
    q = new LNode;
    q->next = NULL;
    printf("Node->data:");
    scanf("%d",&(q->data));
    p->next = q;
    return OK;
}

/*
print all data of the list
*/
Status OutputList(LinkList &L)
{
    if(L->next == NULL)
    {
        printf("the linklist is null !\n");
        return OK;
    }
    LNode *p = L->next;
    while(p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    return OK;
}

/*

*/
Status ReverseList(LinkList &L)
{
    LNode *pre = NULL;
    LNode *cur = L->next;
    LNode *aft = cur->next;

    while(aft != NULL)
    {
        cur->next = pre;
        pre = cur;
        cur = aft;
        aft = aft->next;
    }
    cur->next = pre;
    L->next = cur;
    return OK;
}

/*
sort from smallest to biggest
*/
Status SortList(LinkList &L)
{
    LNode *p = L->next;
    LNode *q = p->next;
    ElemType temp;
    while(p->next != NULL)
    {
        while(q != NULL)
        {
            if((q->data) > (p->data))
            {
                temp = q->data;
                q->data = p->data;
                p->data = temp;
            }
            q = q->next;
        }
        p = p->next;
        q = p->next;
    }
    return OK;
}

/*
destroy list
*/
Status DeleteList(LinkList &L)
{
    LNode *p = L->next;
    while(p != NULL)
    {
        LNode *temp = p;
        p = p->next;
        L->next = p;
        delete(temp);
    }
    return OK;
}

main.c:

#include <iostream>
#include"LinkList.h"

using namespace std;
/*
1、(2013年 829)已知有两个带头结点的单链表A和B,元素值递增有序,编写函数,
调整删减A链表,使A链表结点元素值为A、B的交集,并成为一个递减有序的单链表。
要求先给出思想算法,再写出相应代码。

2、(2013年 829)编写函数,用非递归方法,求二叉树表表示的二叉树T的高度。
要求先给出方法思想,再写出相应代码。
*/
/*
A = A∩B
*/
void InterSecList(LinkList &LA, LinkList &LB)
{
    LNode *pre_pa = LA;
    LNode *pa = LA->next;
    LNode *pb = LB->next;
    while((pa != NULL) && (pb != NULL ))
    {
        if((pa->data)>(pb->data))
        {
            LNode *temp =  pa;
            pa = pa->next;
            pre_pa->next = pa;
            delete(temp);
            continue;
        }
        if ((pa->data)<(pb->data))
        {
            pb = pb->next;
            continue;
        }
        if ((pa->data) = (pb->data))
        {
            pre_pa = pa;
            pa = pa->next;
        }
    }
    if(pb == NULL)
    {
        DeleteList(pre_pa);
    }
}

/*
create a list which has "num" node.
*/
void CreateList(LinkList &L, int num)
{
    for(int i =0; i<num; i++)
    {
        CreateNode(L);
    }
}

int main()
{
    LinkList A;
    LinkList B;

    ElemType ALength;
    ElemType BLength;

    //Init List
    InitList(A);
    InitList(B);

    //input A length
    printf("input A length:");
    scanf("%d",&ALength);

    CreateList(A,ALength);
    OutputList(A);
    printf("\n");

    //input B length
    printf("input B length:");
    scanf("%d",&BLength);
    CreateList(B,BLength);
    OutputList(B);

    printf("\n");
    SortList(A);
    OutputList(A);

    printf("\n");
    SortList(B);
    OutputList(B);
    printf("\n");
    InterSecList(A,B);
    if(A != NULL)
    {
        OutputList(A);
    }

    return 0;
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值