#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"//用于产生随机数
#include "time.h"//时间作为随机种子
#define ERRO 0
#define OK 1
typedef int ElemType;//元素类型名重命名
typedef int Status;//状态类型重命名
/*结点结构体*/
typedef struct Node
{
ElemType data;//数据域
struct Node *next;//存放后继节点的指针域
}Node;
typedef Node *LinkList;//定义一个结构体指针,取一个别名
/***********************************************关于 typedef Node *LinkList 的理解*************************************
typedef Node *LinkList定义了一个结构体指针,Status CreatLinkList (LinkList *L,int n)的参数1定义了一个结构体指针的指针,
插入和删除用到的是实参,如果只传个形参过去是不行的,所以就需要用指向指针的指针。虽然在Status CreatLinkList (LinkList L,int n)
中L是一个一级指针,假如 L=PA,那么L得到的是PA的地址,然后在函数中对L的值(值为地址)进行改变,那么实际上改变的只形参L的地址,并没
有改变PA的地址值,为了改变PA的地址值,需要二级指针。
***********************************************************************************************************************/
/*头插法
Status CreatLinkList (LinkList *L,int n)//创建链表,L是指针的指针,n为创建的数据个数
{
LinkList p;
int i;
srand(time(0));//初始化随机种子
*L = (LinkList)malloc(sizeof(Node));//*L是一个指针的地址,不是访问地址对应的值,因为它是二级指针
(*L)->next = NULL;//->的运算优先级高于*,所以加括号,建立一个头节点,因为刚开始还没有元素,所以指向空
for ( i = 0; i < n ; i++)
{
p = (LinkList)malloc(sizeof(Node));//生成新节点
p->data = rand() % 100 + 1;//产生随机数
p->next = (*L)->next; //头插法
(*L)->next = p;
}
}*/
/*********************************尾插法********************************************************/
Status CreatLinkList(LinkList *L, int n)//创建链表,L是指针的指针,n为创建的数据个数
{
LinkList p,r;
int i;
srand(time(0));//初始化随机种子
*L = (LinkList)malloc(sizeof(Node));//*L是一个指针的地址,不是访问地址对应的值,因为它是二级指针
r = *L;//指向尾部结点
for (i = 0; i < n; i++)
{
p = (Node*)malloc(sizeof(Node));//生成新节点
p->data = rand() % 100 + 1;//产生随机数
r->next = p;//尾部结点变为为p
r = p;//尾部加一为p
}
r->next = NULL;
return OK;
}
/*********************************合并两个链表**********************************************/
Status LinklistMerge(LinkList L, LinkList J)//第一个链表的尾结点和第二个链表的头结点合并,并传递给K
{
LinkList p;
p = L->next;
while (p->next)//获得尾部指针
{
p = p->next;
}
p->next = J->next;//让尾部结点指针指向第二个链表头节点
free(J);//释放头节点
}
/**********************************求表长**************************************************/
Status LinklistLength(LinkList L)
{
LinkList p;
int j=0;
p = L->next;
while (p!=NULL)
{
j++;
p = p->next;
}
printf("%d",j);
}
/*********************************元素输出**************************************************/
void ListOutput(LinkList L)
{
LinkList p;
p = L->next;
while (p != NULL)
{
printf("%d->", p->data);
p = p->next;
}
printf("||");
}
void main()
{
LinkList List1, List2;
int length;
CreatLinkList(&List1, 5);
CreatLinkList(&List2, 5);
ListOutput(List1);
LinklistLength(List1);
printf("\n");
ListOutput(List2);
LinklistLength(List2);
LinklistMerge(List1,List2);
printf("\n");
ListOutput(List1);
LinklistLength(List1);
printf("\n");
}
单链表的合并
猜你喜欢
转载自blog.csdn.net/qq_37422050/article/details/105178912
今日推荐
周排行