一、题目
(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;
}