尾插法生成链表及快速找到该链表的中间结点值

@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;
}

结果展示:在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值