@TOC尾插法生成链表及快速找到该链表的中间结点值
1 用尾插法随机生成9个元素的单链表
//实现随机生成9个元素的链表。(尾插法)
LinkList Creat_list(LinkList head)
{
head = (LinkList)malloc(sizeof(Node)); //为头指针开辟内存空间
LinkList newnode = NULL; //定义新结点
LinkList endnode = NULL; //定义尾结点
head->next = NULL; //初始化头结点指向的下一个地址为NULL
endnode = head ; //未创建其余结点之前,只有一个头结点
for(int i =0;i<9;i++)
{
newnode = (LinkList)malloc(sizeof(Node)); //为新结点开辟新内存
newnode->data =(int)(10.0*rand()/(RAND_MAX+1.0));//为新结点的数据域赋值1-10
endnode->next = newnode;
endnode = newnode;
}
endnode->next = NULL;
return head;
}
2.利用快慢两个指针快速查找链表中间结点值
代码:
//快速找到未知长度单链表的中间结点值
int GetMidNode(LinkList L,ElemType *e)
{
//构造快慢两个指针
LinkList search ,mid;
mid = search = L->next;
while (search->next != NULL)
{
//search移动的速度是mid的2倍
if (search->next->next != NULL)
{
search = search->next->next;
mid = mid->next;
}
else
{
search = search->next;
}
}
*e = mid->data;
printf("%d\n",*e);
return 0;
}
3:完整代码展示:
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node* next;
}Node;
typedef struct Node* LinkList;
LinkList Creat_list(LinkList head);
void illustrate(LinkList head);
//实现随机生成9个元素的链表。(尾插法)
LinkList Creat_list(LinkList head)
{
head = (LinkList)malloc(sizeof(Node)); //为头指针开辟内存空间
LinkList newnode = NULL; //定义新结点
LinkList endnode = NULL; //定义尾结点
head->next = NULL; //初始化头结点指向的下一个地址为NULL
endnode = head ; //未创建其余结点之前,只有一个头结点
for(int i =0;i<9;i++)
{
newnode = (LinkList)malloc(sizeof(Node)); //为新结点开辟新内存
newnode->data =(int)(10.0*rand()/(RAND_MAX+1.0));//为新结点的数据域赋值1-10
endnode->next = newnode;
endnode = newnode;
}
endnode->next = NULL;
return head;
}
//输出链表元素
void illustrate(LinkList head)
{
LinkList temp = head; //将头指针的地址赋给临时的指针
while(temp->next != NULL)
{
temp = temp->next;
printf("%d ",temp->data);
}
printf("\n");
}
//快速找到未知长度单链表的中间结点值
int GetMidNode(LinkList L,ElemType *e)
{
//构造快慢两个指针
LinkList search ,mid;
mid = search = L;
while (search->next != NULL)
{
//search移动的速度是mid的2倍
if (search->next->next != NULL)
{
search = search->next->next;
mid = mid->next;
}
else
{
search = search->next;
}
}
*e = mid->data;
printf("%d\n",*e);
return 0;
}
int main()
{
printf("---------------------------------------------\n");
printf("1.创建链表\n");
printf("2.查看链表\n");
printf("3.中间结点值\n");
printf("0.退出\n");
printf("---------------------------------------------\n");
LinkList head = NULL; //链表的头指针
ElemType e,n;
int flag =1;//循环是否结束的标记变量。
printf("请选择你的操作:\n");
while(flag)
{
scanf("%d",&n);
switch(n)
{
case 1:
head = Creat_list(head);
break; //创建链表
case 2:
printf("创建链表元素为:");
illustrate(head);
break; //输出每个结点的数据域
case 3:
printf("链表中间结点值为:");
GetMidNode(head,&e);
break;
case 0:
flag=0;
break;
default:
printf("请选择正确的操作序号");
exit(0);
}
}
system("pause");
return 0;
}