#include<stdio.h>
#include<malloc.h>
//单链表的结点定义
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node *next;
}SLNode;
//初始化
void ListInitiate(SLNode **head)
{
*head = (SLNode *)malloc(sizeof(SLNode));
(*head)->next=NULL;
}
//求当前链表长度
int ListLength(SLNode *head)
{
SLNode *p = head;
int j = 0;
while(p->next != NULL)
{
p=p->next;
j++;
}
return j;
}
//插入
int ListInsert(SLNode *head,int i,DataType x)
{
SLNode *p,*q;
int j,data;
p=head;
j=-1;
while(p->next != NULL && j < i-1)
{
p=p->next;
j++;
}
if(j != i-1)
{
printf("插入元素位置参数错!\n");
return 0;
}
q=(SLNode *)malloc(sizeof(SLNode));
q->data=x;
q->next=p->next;
p->next=q;
return 1;
}
//删除
int ListDelete(SLNode *head,int i,DataType *x)
{
SLNode *p,*s;
int j;
p = head;
j=-1;
while(p->next != NULL && j<i-1)
{
p=p->next;
j++;
}
if(j != i-1)
{
printf("删除元素位置参数错!\n");
return 0;
}
s=p->next;
*x=s->data;
p->next = p->next->next;
free(s);
return 1;
}
//查找
Node *GetLinkNode(SLNode *L,int index)
{
Node *p;
p = L;
int i = 0;//带头结点
while(p != NULL && i < index)
{
p = p->next;
i++;
}
if(i == index)
{
return p;//查找成功
}
return NULL;//查找失败
}
//合并
SLNode *merge(SLNode *LA,SLNode *LB)
{
SLNode *LC;
SLNode *pa,*pb,*r;
pa = LA->next;
pb = LB->next;
LC = LA;//LC置为空表
r = LC;
LC->next = NULL;
while(pa != NULL && pb != NULL)
{
if (pa->data <= pb->data)
{
r->next = pa;
r = pa;
pa = pa->next;
}
else
{
r->next = pb;
r = pb;
pb = pb->next;
}
}
if (pa)
{
r->next = pa;
}
else
{
r->next = pb;
}
free(LB);
return LC;
}
//显示当前数据元素
int ListGet(SLNode *head,int i,DataType *x)
{
SLNode *p;
int j;
p=head;
j=-1;
while(p->next != NULL && j<i)
{
p = p->next;
j++;
}
if(j != i)
{
printf("去元素位置参数错!\n");
return 0;
}
*x = p->data;
return 1;
}
int main()
{
SLNode *head,*L2;
int i,x,m,n,t,j;
ListInitiate(&head);
ListInitiate(&L2);
printf("输出L1已有单链表数据\n");
for(i=0;i<10;i++)
{
ListInsert(head,i,i+1);
}
for(i=0;i<ListLength(head);i++)
{
ListGet(head,i,&x);
printf("%d " ,x);
}
printf("\n");
printf("输出L2已有单链表数据\n");
for(i=0;i<5;i++)
{
ListInsert(L2,i,i+10);
}
for(i=0;i<ListLength(L2);i++)
{
ListGet(L2,i,&x);
printf("%d " ,x);
}
printf("\n");
printf("输出L1链表长度\n");
j=ListLength(head);
printf("%d\n",j);
printf("输入L1两个10以内任意数字(并用逗号隔开)\n");
scanf("%d,%d",&m,&n);
ListInsert(head,m,n);
for(i=0;i<ListLength(head);i++)
{
ListGet(head,i,&x);
printf("%d " ,x);
}
printf("\n");
//删除
printf("输入L1一个10以内任意数字");
scanf("%d",&t);
ListDelete(head,t,&x);
//查找
Node *p;
printf("查找第三个结点\n");
p=GetLinkNode(head,3);
printf("%d\n",*p);
//合并
printf("输出合并后的链表L3\n");
Node *L3=merge(head,L2);
for(i=0;i<ListLength(L3);i++)
{
ListGet(L3,i,&x);
printf("%d ",x);
}
printf("\n");
return 0;
}