假设有两个按元素值非递减有序排列的正整数序列,请以单链表存储结构构造线性表A和B,然后再把A表和B表归并成一个按元素值非递增有序排列的线性表C。同时在C表中实现如下两个功能:1、查找是否存在值为x的元素;2、删除值为y的元素。
要求:
1、单链表A、B和C都不含头结点。
2、首先根据两个非递减序列建立单链表A和B,然后再构造单链表C。
3、创建单链表A和B时,直接从键盘输入两个非递减的序列,0为输入结束的标志。
4、不能利用原表(即A表和B表)的结点空间,即构造的C表中每个结点空间要重新申请。
#include<stdio.h>
#include<stdlib.h>
struct MyList{
int val;
MyList* next;
};
MyList* createNode(int val)
{
MyList* x = (MyList*)malloc(sizeof(MyList));
x->val = val;
x->next = NULL;
return x;
}
bool select_val(MyList* head, int val)
{
MyList* p = head;
while(p != NULL && p->val <= val)
{
if(p->val == val)
return true;
p = p->next;
}
return false;
}
bool delete_val(MyList* &head, int val)
{
MyList* p = head;
MyList* f = NULL;
while(p != NULL && p->val <= val)
{
if(p->val == val)
{
if(head == p)
head = head->next;
else
f->next = p->next;
delete(p);
return true;
}
f = p;
p = p->next;
}
return false;
}
void showList(MyList* head)
{
MyList* p = head;
while(p != NULL)
{
printf("%d ", p->val);
p = p->next;
}
printf("\n");
}
int main()
{
int val;
MyList* A = NULL;
MyList* p = NULL;
while(true)
{
scanf("%d", &val);
if(val == 0) break;
MyList* x = createNode(val);
if(A == NULL) A = x;
else p->next= x;
p = x;
}
showList(A);
MyList* B = NULL;
MyList* s = NULL;
while(true)
{
scanf("%d", &val);
if(val == 0) break;
MyList* x = createNode(val);
if(B == NULL) B = x;
else s->next= x;
s = x;
}
showList(B);
p = A;
s = B;
MyList* C = NULL;
MyList* ce = NULL;
while(p != NULL || s != NULL)
{
if(s == NULL || (p != NULL && p->val <= s->val))
{
MyList* x = createNode(p->val);
if(C == NULL) C = x;
else ce->next= x;
ce = x;
p = p->next;
}
else
{
MyList* x = createNode(s->val);
if(C == NULL) C = x;
else ce->next= x;
ce = x;
s = s->next;
}
}
showList(C);
delete_val(C, 5);
showList(C);
delete_val(C, 3);
showList(C);
delete_val(C, 1);
showList(C);
return 0;
}