#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
typedef int ElemType,Status;
typedef struct LNod
{
ElemType data;
struct LNod *next;
}LNode,*LinkList;
//创建单链表
void CreateList_L(LinkList &L,int n)
{
int i;
LinkList p,q;
L=(LinkList)malloc(sizeof(LNode));
L->next = NULL;
q=L;
for (i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
q->next=p;
q=p;
}
q->next=NULL;
}
//取出单链表中的某个元素
Status GetElem_L(LinkList L,int pos,ElemType &e)
{
LinkList p=L->next;
int j=1;
while (p && j<pos)
{
p=p->next;
j++;
}
if(!p)
{
return 0;
}else
{
e=p->data;
}
return e;
}
//往单链表中插入一个元素
Status ListInsert_L(LinkList &L,int pos,ElemType e)
{
LinkList q;
LinkList p=L->next;
int j=1;
while (p&&j<pos-1)
{
p=p->next;
j++;
}
if (!p)
{
return 0;
}
else
{
q=(LinkList)malloc(sizeof(LNode));
q->data=e;
q->next=p->next;
p->next=q;
}
return 1;
}
//并归 充分利用前面写好的函数 GetElem_L ListInsert_L
//另外再实现 int LocatElemt(LinkList L,ElemType e)
// 1 把L2的元素逐个取出来存在E中
// 2 把E和L1的元素进行比较,看L1中有没E存在
// 3 不存在,则把E插入到L1的后面
//计算单链表的长度
int len_l(LinkList L)
{
LinkList p;
p=L->next;
int j=0;
while (p)
{
j++;
p=p->next;
}
return j;
}
//把e和L的元素进行比较,看L中有没e存在
int LocatElemt(LinkList L,ElemType e)
{
LinkList p=L->next;
int Len=len_l(L);
int j=1;
while (j<=Len && p->data!=e)
{
j++;
p=p->next;
}
if(!p)
return 0;
else
return j;
}
//两个单链表进行并归
void add_L(LinkList L1,LinkList L2)
{
int L1len=len_l(L1);
int L2len=len_l(L2);
int j;
ElemType e;
for (j=1;j<=L2len;j++)
{
GetElem_L(L2,j,e);
if (LocatElemt(L1,e)==0)
{
ListInsert_L(L1,++L1len,e);
}
}
}
//输出单链表
void list_printf(LinkList L)
{
LinkList p;
p=L->next;
while (p)
{
printf("%d ",p->data);
p=p->next;
}
}
void main()
{
LinkList L1,L2;
printf("请输入L1单链表的值:\n");
CreateList_L(L1,4);
// printf("L1的长度为:%d\n",len_l(L1));
printf("请输入L2单链表的值:\n");
CreateList_L(L2,3);
printf("L1单链表的值为:\n");
list_printf(L1);
printf("\n");
printf("L2单链表的值为:\n");
list_printf(L2);
printf("\n");
printf("并归后的单链表为:\n");
add_L(L1,L2);
list_printf(L1);
printf("\n");
}
运行结果: