C语言结构体使用之链表

yizhihongxing

C语言结构体使用之链表

1. 链表的定义

链表是一种动态数据结构,它由若干个节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。

链表可以分为单链表、双向链表和循环链表几种形式,这里我主要介绍单链表的使用。

2. 链表的声明

链表的声明需要定义链表节点的数据类型,链表的头指针以及一些和链表相关的操作函数。具体代码如下:

//定义链表节点的数据类型
typedef struct node{
    int data;
    struct node *next;
}Node;

//定义链表头指针
typedef struct list{
    Node *head;
    int length;
}List;

//定义链表相关的操作函数
void initList(List *list);
void addNode(List *list, int data);
void deleteNode(List *list, int data);
void printList(List *list);

3. 链表的初始化

链表的初始化需要分配一个头节点,并将头指针指向该节点。链表的长度初始为0。

void initList(List *list){
    Node *head = (Node*)malloc(sizeof(Node));
    head->next = NULL;
    list->head = head;
    list->length = 0;
}

4. 链表的插入

链表的插入可以分为头插法和尾插法两种方式。由于头插法比较简单,这里我只讲解头插法的使用。

void addNode(List *list, int data){
    Node *newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = list->head->next;
    list->head->next = newNode;
    list->length++;
}

5. 链表的删除

链表的删除可以根据数据元素的值或者节点的位置进行操作,这里我只讲解根据数据元素进行删除的方式。

删除的过程需要找到该节点的前驱节点,将前驱节点的指针指向该节点的后继节点,并释放该节点的内存。

void deleteNode(List *list, int data){
    Node *p = list->head->next;
    Node *pre = list->head;

    while(p != NULL && p->data != data){
        pre = p;
        p = p->next;
    }

    if(p == NULL){
        printf("不存在该节点\n");
    }else{
        pre->next = p->next;
        free(p);
        list->length--;
    }
}

6. 链表的遍历

链表的遍历需要从头节点开始遍历,直到遇到NULL节点截止。在遍历的过程中可以输出节点的数据元素。

void printList(List *list){
    Node *p = list->head->next;

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

    printf("\n");
}

7. 链表的使用示例

下面是一个使用链表进行排序的示例程序。

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

typedef struct node{
    int data;
    struct node *next;
}Node;

typedef struct list{
    Node *head;
    int length;
}List;

void initList(List *list);
void addNode(List *list, int data);
void deleteNode(List *list, int data);
void printList(List *list);
void sortList(List *list);

void initList(List *list){
    Node *head = (Node*)malloc(sizeof(Node));
    head->next = NULL;
    list->head = head;
    list->length = 0;
}

void addNode(List *list, int data){
    Node *newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = list->head->next;
    list->head->next = newNode;
    list->length++;
}

void deleteNode(List *list, int data){
    Node *p = list->head->next;
    Node *pre = list->head;

    while(p != NULL && p->data != data){
        pre = p;
        p = p->next;
    }

    if(p == NULL){
        printf("不存在该节点\n");
    }else{
        pre->next = p->next;
        free(p);
        list->length--;
    }
}

void printList(List *list){
    Node *p = list->head->next;

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

    printf("\n");
}

void sortList(List *list){
    Node *p = list->head->next;
    int i, j, len = list->length;
    int temp;

    for(i=0; i<len-1; i++){
        p = list->head->next;
        for(j=0; j<len-i-1; j++){
            if(p->data > p->next->data){
                temp = p->data;
                p->data = p->next->data;
                p->next->data = temp;
            }
            p = p->next;
        }
    }
}

int main()
{
    int a[10] = {5, 2, 4, 3, 1, 7, 8, 9, 6, 0};

    List list;
    initList(&list);

    for(int i=0; i<10; i++){
        addNode(&list, a[i]);
    }

    printf("排序前的链表:");
    printList(&list);

    sortList(&list);

    printf("排序后的链表:");
    printList(&list);

    return 0;
}

以上就是关于C语言结构体使用之链表的完整攻略,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言结构体使用之链表 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • QT中出现“无法解析的外部符号”错误

    在QT中出现“无法解析的外部符号”错误通常是由于编译器无法找到所需的函数或变量定义,或者链接器无法找到所需的库文件。在本文中,我们将详细介绍解决这种错误的完整攻略,并提供两个示例说明。 解决“无法解析的外部符号”错误的攻略 1. 检查头文件和源文件 首先,我们需要检查头文件和源文件是否正确包含所需的函数或变量定义。如果头文件或源文件中缺少所需的定义,编译器将…

    other 2023年5月5日
    00
  • 如何使用Bootstrap的modal组件自定义alert,confirm和modal对话框

    Bootstrap的modal组件可以帮助我们创建自定义的alert、confirm和modal对话框。下面是使用Bootstrap的modal组件自定义alert、confirm和modal对话框的完整攻略: 准备工作 在进行下一步之前,需确保已经引入了Bootstrap框架。如未引入,可以在head标签中添加以下代码: <link rel=&quo…

    other 2023年6月26日
    00
  • 批处理文件制作实例精彩教程

    下面我将详细讲解“批处理文件制作实例精彩教程”的完整攻略。 介绍 批处理文件是Windows操作系统下的一款常用脚本工具,通过批处理文件可以实现自动化的批量任务,例如文件复制、目录管理、备份等。本教程将全面介绍批处理文件的制作过程。 大纲 本教程包含以下内容: 批处理文件概述,包含批处理文件定义、扩展名、运行方法等。 批处理文件基础语法,包含批处理文件编写的…

    other 2023年6月26日
    00
  • 在Python中使用模块的教程

    在Python中使用模块的教程 什么是模块? 在Python中,模块是一个包含了函数、类和变量的文件。它们被用来组织和重用代码,使得代码更加模块化和可维护。Python标准库中已经包含了许多有用的模块,同时你也可以创建自己的模块。 导入模块 要使用一个模块,首先需要将其导入到你的代码中。Python提供了几种导入模块的方式: 使用import语句导入整个模块…

    other 2023年8月21日
    00
  • 在目标上单击鼠标右键后出现添加到收藏夹的窗口怎么办

    首先,为了能够解决这个问题,我们需要了解一些基本的知识背景。当我们在浏览器中访问一个网站时,浏览器会自动将网站的URL保存在浏览器的收藏夹或书签中,以方便我们下次访问该网站。如果你在浏览一个网站时,不小心点击了鼠标右键,就会出现一个“添加到收藏夹”的窗口。 如果你希望避免这种情况,可以通过以下两种方法解决: 方法一:使用JavaScript 你可以在网站的代…

    other 2023年6月27日
    00
  • java的SimpleDateFormat线程不安全的几种解决方案

    Java 的 SimpleDateFormat 类是用于将日期格式化为字符串,并将字符串解析为日期的类。但是,SimpleDateFormat 是非线程安全的,在并发执行时可能会出现问题,比如出现解析日期错乱、日期格式化异常等问题。为了避免这些问题,我们需要采取一些措施。 以下是几种解决 SimpleDateFormat 线程不安全问题的方法。 1. 使用 …

    other 2023年6月26日
    00
  • tkinter布局之pack

    tkinter布局之pack 在使用Tkinter创建GUI应用程序时,布局是必不可少的一部分。布局确定了应用程序中控件的位置和大小。Tkinter提供三种布局管理器:pack、grid和place,本文主要讲解pack布局。 pack布局概述 pack布局是一种自适应布局,它根据控件的大小和容器的大小来调整控件的位置。pack布局按照添加顺序依次将控件放置…

    其他 2023年3月28日
    00
  • Android 使用AsyncTask实现断点续传

    Android 使用 AsyncTask 实现断点续传攻略 在 Android 开发中,我们可以使用 AsyncTask 类来实现断点续传功能。AsyncTask 是一个异步任务类,可以在后台执行耗时操作,并在主线程更新 UI。 步骤一:创建 AsyncTask 子类 首先,我们需要创建一个继承自 AsyncTask 的子类,用于执行断点续传的任务。在这个子…

    other 2023年9月7日
    00
合作推广
合作推广
分享本页
返回顶部