数据结构_Chapter2.2.5 链表

浙大陈越老师主编《数据结构》(第2版)学习笔记

例2.4 设计函数将链表L就地逆转

注:此例中单链表头节点是一个空节点,该节点的value空置,而next指向链表的第一个真正节点

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct Node_t * PtrToNode;

typedef struct Node_t
{
    int value;
    PtrToNode next;
}Node;

/* 构建链表:从头处插入 */
int create_list_by_insert_head(int* array, int array_len, PtrToNode* head)
{
    int i;
    PtrToNode tmp_head = NULL;
    PtrToNode tmp_ptr = NULL;

    if(array_len <= 0)
    {
        printf("Error: param error. len[%d] \n", array_len);
        return -1;
    }
    else if(NULL == array || NULL == head)
    {
        printf("Error: param error. \n");
        return -1;
    }

    tmp_ptr = (PtrToNode)calloc(1, sizeof(Node));
    tmp_ptr->next = NULL;
    tmp_head = tmp_ptr;

    for(i = (array_len - 1); i >= 0; i--)
    {
        tmp_ptr = (PtrToNode)calloc(1, sizeof(Node));
        tmp_ptr->value = array[i];
        tmp_ptr->next = tmp_head->next;
        tmp_head->next = tmp_ptr;
    }

    *head = tmp_head;

    return 0;
}

/* 构建链表:从尾处插入 */
int create_list_by_insert_tail(int* array, int array_len, PtrToNode* head)
{
    int i;
    PtrToNode tmp_head = NULL;
    PtrToNode tmp_tail = NULL;
    PtrToNode tmp_ptr = NULL;

    if(array_len <= 0)
    {
        printf("Error: param error. len[%d] \n", array_len);
        return -1;
    }
    else if(NULL == array || NULL == head)
    {
        printf("Error: param error. \n");
        return -1;
    }

    tmp_ptr = (PtrToNode)calloc(1, sizeof(Node));
    tmp_ptr->next = NULL;
    tmp_tail = tmp_ptr;
    tmp_head = tmp_tail;

    for(i = 0; i < array_len; i++)
    {
        tmp_ptr = (PtrToNode)calloc(1, sizeof(Node));
        tmp_ptr->value = array[i];
        tmp_ptr->next = NULL;
        tmp_tail->next = tmp_ptr;
        tmp_tail = tmp_ptr;
    }

    *head = tmp_head;

    return 0;
}

int reverse_list(PtrToNode head)
{
    int i;
    PtrToNode old_head = NULL;
    PtrToNode tmp_head = NULL;
    PtrToNode tmp_ptr = NULL;
    PtrToNode tmp_next = NULL;

    if(NULL == head)
    {
        printf("Error: param error. \n");
        return -1;
    }

    tmp_head = head;

    old_head = head->next;
    tmp_head->next = NULL;

    /* 遍历旧链节点 */
    while(NULL != old_head)
    {
        tmp_next = old_head->next;

        /* 将旧链头部节点插入新链头部节点后 */
        old_head->next = tmp_head->next;
        tmp_head->next = old_head;

        old_head = tmp_next;
    }


}

void print_list(PtrToNode head)
{
    PtrToNode tmp_ptr = head;

    if(NULL == head)
    {
        printf("Error: param error \n");
        return;
    }

    while(NULL != tmp_ptr->next)
    {
        tmp_ptr = tmp_ptr->next;
        printf("%d ", tmp_ptr->value);
    }

    printf("\n");

    return;
}

void free_list(PtrToNode head)
{
    PtrToNode tmp_ptr = head;
    PtrToNode tmp_next;

    printf("free node: ");

    while(NULL != tmp_ptr)
    {
        tmp_next = tmp_ptr->next;
        free(tmp_ptr);
        tmp_ptr = tmp_next;
    }

    printf("\n");

    return;
}

int main()
{
    int ret = 0;
    int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
    int array_len = sizeof(array) / sizeof(array[0]);
    PtrToNode array_head1 = NULL;
    PtrToNode array_head2 = NULL;

    ret = create_list_by_insert_head(array, array_len, &array_head1);
    if(0 != ret)
    {
        printf("Error: create_list_by_insert_head failed.\n");
        return ret;
    }

    printf("list1: \n");
    print_list(array_head1);
    free_list(array_head1);

    ret = create_list_by_insert_tail(array, array_len, &array_head2);
    if(0 != ret)
    {
        printf("Error: create_list_by_insert_tail failed.\n");
        return ret;
    }

    printf("list2: \n");
    print_list(array_head2);

    ret = reverse_list(array_head2);
    if(0 != ret)
    {
        printf("Error: reverse_list failed.\n");
        free_list(array_head2);
        return ret;
    }

    printf("list after reverse: \n");
    print_list(array_head2);
    free_list(array_head2);

    return 0;
}

### 回答1: Quectel LTE是一家专门生产和提供LTE(Long-Term Evolution)通讯模块、智能模块、车载通讯模块和无线通信网络解决方案的公司。该公司总部位于中国上海,并在全球各地拥有分支机构和销售网络。 随着5G技术的发展,Quectel LTE已成为世界领先的LTE模块供应商之一。其产品线包括面向工业、车载、智能家居、电子支付等领域的多种LTE模块,以及适配各种操作系统的软件和驱动程序等。Quectel LTE的产品已被广泛应用于车载通讯、智能家居、电子支付、物联网等领域。 为了确保产品的品质与可靠性,Quectel LTE不断进行技术创新和不断优化产品设计。同时,该公司的产品也获得了国际上多项重要认证,如FCC、CE、GCF、PTCRB、AT&T、Verizon等。Quectel LTE致力于提供卓越的解决方案,为全球客户提供卓越的用户体验。 ### 回答2: Quectel LTE是一种高速的无线通信技术,可实现4G LTE网络下的高质量数据传输。它是一款由Quectel无线通信有限公司研发的LTE模块,可支持全球主要的LTE运营商网络,如AT&T、Verizon、T-Mobile等。 Quectel LTE模块集成了多种功能,包括全球导航卫星系统(GNSS)定位、低功耗蓝牙(BLE)和射频前端(RFFE)控制等,从而可大大简化物联网设备的设计和集成。此外,Quectel LTE模块还具备遥测和远程控制等功能,可为用户提供更全面、更高效的解决方案。因此,它在智能物联网、车联网、工业自动化等领域应用广泛,为设备联网和智能化带来很大的便利。 ### 回答3: Quectel LTE是一种高速移动通信技术,能够提供更快速度和更高带宽的数据传输。它基于LTE(Long-Term Evolution)技术标准,可以在全球范围内进行无线网络连接。Quectel LTE技术可用于各种应用场景,包括物联网、智能家居、智能城市和自动化生产等。 与传统的2G和3G网络相比,Quectel LTE技术具有更高的速度和更低的延迟。这种技术可以让用户更快地下载和上传数据,同时还可以提供更稳定和可靠的连接。此外,它还可以通过LTE Cat 1、Cat 4、Cat 6、Cat 9和Cat 18等不同的速率等级来满足不同需求。 作为一种领先的LTE模块供应商,Quectel提供许多不同类型的LTE模块,包括EM系列、EC系列、EP系列和EG系列等。这些模块提供各种性能、尺寸和功耗选项,以满足不同的应用需求。此外,Quectel还提供与其他无线技术(如WiFi、蓝牙和GPS)集成的模块,以进一步扩展其应用范围。 总之,Quectel LTE技术是一种广泛应用的高速数据传输技术,通过提供更快的速度、更低的延迟和更可靠的连接,可以满足不同应用场景的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值