C语言结构体使用之链表

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日

相关文章

  • 条件数据库Android:sqllite的简单使用

    下面是“条件数据库Android:sqllite的简单使用”的完整攻略。 1. 前言 SQLite是一款功能强大的嵌入式关系型数据库,它被广泛应用在各个领域当中,而在Android中,SQLite是Android中的默认数据库,因此它也被广泛地应用在Android项目中。本篇文章将介绍在Android开发中如何使用SQLite数据库。 2. 实现SQLite…

    other 2023年6月26日
    00
  • C语言简明介绍常见关键字的用法

    C语言简明介绍常见关键字的用法 C语言作为一种广泛应用于系统编程和嵌入式开发的程序设计语言,在程序员中拥有广泛的用户群体。C语言中关键字的使用对于程序开发来说是至关重要的。在这里,我们将简明介绍一些C语言中常见关键字的用法。 数据类型关键字 C语言中有丰富的数据类型,每种类型都有其对应的关键字。在程序中正确使用这些关键字是确保数据类型正确运用的关键。 int…

    other 2023年6月27日
    00
  • Android后台模拟点击探索(附源码)

    Android后台模拟点击探索(附源码)攻略 本攻略将详细介绍如何在Android应用中使用后台模拟点击的技术。通过模拟点击,我们可以在后台执行一些用户交互操作,例如点击按钮、输入文本等。这对于自动化测试、批量操作等场景非常有用。 步骤一:添加权限 首先,在AndroidManifest.xml文件中添加以下权限: <uses-permission a…

    other 2023年9月7日
    00
  • Python二进制数据结构Struct的具体使用

    Python二进制数据结构Struct的具体使用 什么是Struct Struct是Python标准库中提供的一个二进制数据结构处理模块,可以使用它来实现二进制流数据的打包与解包。通过Struct,我们可以快速且方便地处理各种二进制数据格式,例如进行网络传输的数据包、读写二进制文件等。在Python中使用Struct可以显著提高二进制数据处理的效率。 Str…

    other 2023年6月27日
    00
  • 如何创建word文档?创建新word文档五大方法

    创建Word文档是我们日常办公工作中经常要用到的基本操作。下面我们来介绍创建Word文档的五种常见方法: 方法一:使用 Word 软件创建新文档 打开 Word 软件,可以看到欢迎界面。 选择“空白文档”选项,创建一个新的空白文档。 在新的 Word 文档中,输入内容并进行排版,格式化文本等操作。 保存文件,可以选择不同的存储位置和格式,如.docx、.do…

    other 2023年6月27日
    00
  • meta标签设置(移动端)

    什么是meta标签? meta标签是HTML文档中的一种特殊标签,用于提供有关文档的元数据信息。在移动端网页开发中,meta标签可以用于设置网页的视口(viewport)、缩放比例、主题颜色等信息。 meta标签设置(移动端) 以下是在移动端网页开发中常用的meta标签设置: 设置视口(viewport) 视口是指用户在浏览器中看到的网页区域。在移动设备上,…

    other 2023年5月7日
    00
  • Win7旗舰版连接打印机报错0x00000002怎么办 错误代码0x00000002解决办法

    Win7旗舰版连接打印机报错0x00000002的解决办法 在连接打印机的时候,有部分用户可能会遇到Win7旗舰版连接打印机报错0x00000002的情况,即系统提示“无法连接到打印机,错误代码0x00000002”的错误信息,导致无法正常使用打印机。这种情况下,应该如何解决呢?下面我们提供一些解决方法。 方法一:删除打印机驱动 这种情况下,我们可以尝试删除…

    other 2023年6月27日
    00
  • 网页右键ie不支持event.preventDefault和event.returnValue (需要加window)

    题目中提到的问题是指当网页在IE浏览器中进行右键操作时,无法使用event.preventDefault()或event.returnValue来阻止默认行为,需要使用window.event.returnValue来实现。下面是解决该问题的完整攻略。 问题描述 IE浏览器中右键网页时,无法使用event.preventDefault()或event.ret…

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