69,379
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define OVERFLOW -2
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct LNode{
ElemType data;
struct LNode *next;
} LNode, *LinkList;
////创建链表
//插头法创建
Status CreateList(LinkList &L, int n)
{
int i;
L=(LinkList)malloc(sizeof(LNode));
if(!L) {
exit(ERROR);
}
L->data=n;
L->next=NULL;
printf("请输入元素:\n");
for(i=0;i<n;i++)
{
LinkList p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
}
return OK;
}
///保存元素
Status CommonList(LinkList La,LinkList Lb,LinkList &Lc)
{
Lc=(LinkList)malloc(sizeof(LNode));
if(!Lc) {
exit(ERROR);
}
Lc->next=NULL;
LinkList p = La->next, q = Lb->next, t = Lc;
while(p != NULL && q != NULL) {
if(p->data > q->data) {
q = q->next;
}
else if(p->data < q->data) {
p = p->next;
}
else {
t->next = p;
t = p;
p = p->next;
q = q->next;
}
}
t->next = NULL;
return OK;
}
////输出元素
Status PrintList(LinkList L)
{
if(L == NULL) {
printf("链表未创建!\n");
exit(1);
}
printf("链表的元素为:");
while(L->next)
{
L=L->next;
printf("%d ",L->data);
}
printf("\n");
return OK;
}
////对单链表进行排序
void sort(LinkList &L)
{
LinkList pre = L, q, t, endptr = L;
int len = 0;
int i, flag = 1, j = 0;
while(endptr->next != NULL) {
endptr = endptr->next;
len++;
}
for(i = 0; i < len - 1 && flag; i++) {
flag = 0;
t = pre->next;
q = t->next;
for(; q != endptr; q = t->next) {
if(t->data > q->data) { //交换p, q
pre->next = q;
t->next = q->next;
q->next = t;
flag = 1;
}
pre = pre->next;
t = pre->next;
}
if(t->data > q->data) { //交换p, q
pre->next = q;
t->next = q->next;
q->next = t;
endptr = q;
}
else {
endptr = t;
}
pre = L;
}
}
////主函数
int main()
{
LinkList LA,LB,LC;
int na,nb,nc;
printf("请输入链表LA的个数:");
scanf("%d",&na);
CreateList(LA,na);
sort(LA);
PrintList(LA);
printf("请输入链表LB的个数:");
scanf("%d",&nb);
CreateList(LB,nb);
sort(LB);
PrintList(LB);
CommonList(LA,LB,LC);
printf("相同元素为:\n");
PrintList(LC);
system("pause");
return 0;
}