c语言结构体怎么用链表「c语言数据结构链表」
在C语言中,结构体是一种自定义的数据类型,可以包含多个不同类型的数据成员,链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针,结构体和链表的结合可以使我们更方便地组织和管理数据,本文将详细介绍如何在C语言中使用结构体和链表。
(图片来源网络,侵删)
我们需要定义一个结构体来表示链表中的节点,结构体的定义如下:
typedef struct Node { int data; // 节点中的数据 struct Node *next; // 指向下一个节点的指针 } Node;
接下来,我们需要实现一些基本的链表操作,如创建链表、插入节点、删除节点、查找节点等,以下是这些操作的实现:
1、创建链表:
Node *createList() { Node *head = NULL; // 创建一个空链表 return head; }
2、插入节点:
void insertNode(Node **head, int data) { Node *newNode = (Node *)malloc(sizeof(Node)); // 创建一个新的节点 newNode>data = data; // 设置节点中的数据 newNode>next = NULL; // 初始化指向下一个节点的指针为NULL if (*head == NULL) { // 如果链表为空,将新节点设置为头节点 *head = newNode; } else { // 如果链表不为空,找到最后一个节点,将其next指针指向新节点 Node *temp = *head; while (temp>next != NULL) { temp = temp>next; } temp>next = newNode; } }
3、删除节点:
void deleteNode(Node **head, int data) { Node *temp = *head, *prev; // 创建一个临时指针和一个前驱指针,都指向头节点 if (temp != NULL && temp>data == data) { // 如果头节点就是要删除的节点,直接将头节点指向下一个节点 *head = temp>next; free(temp); // 释放头节点的内存空间 return; } while (temp != NULL && temp>data != data) { // 如果找到了要删除的节点,更新前驱指针和临时指针的位置 prev = temp; temp = temp>next; } if (temp == NULL) { // 如果链表中没有要删除的节点,直接返回 return; } prev>next = temp>next; // 将前驱节点的next指针指向要删除节点的下一个节点,从而断开要删除节点的链接关系 free(temp); // 释放要删除节点的内存空间 }
4、查找节点:
Node *findNode(Node *head, int data) { Node *temp = head; // 创建一个临时指针,指向头节点 while (temp != NULL) { // 遍历链表,查找要查找的数据是否在当前节点中 if (temp>data == data) { // 如果找到了要查找的数据,返回当前节点的地址 return temp; } temp = temp>next; // 继续查找下一个节点 } return NULL; // 如果链表中没有要查找的数据,返回NULL }
5、打印链表:
void printList(Node *head) { Node *temp = head; // 创建一个临时指针,指向头节点 while (temp != NULL) { // 遍历链表,打印每个节点中的数据 printf("%d > ", temp>data); temp = temp>next; // 继续查找下一个节点 } printf("NULL "); // 打印链表结束标志NULL }
现在我们已经实现了链表的基本操作,接下来我们可以使用结构体和链表来实现一些实际问题,我们可以创建一个学生信息链表,每个学生的信息包括学号、姓名和成绩,以下是一个简单的示例:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "list.h" // 引入我们实现的链表操作函数所在的头文件(假设文件名为list.h) #define STUDENT_NAME_LEN 20 // 学生姓名的最大长度(包括空格)+1(用于存储字符串结束标志'\0') #define STUDENT_GRADE_MAX 100 // 学生成绩的最大值(假设为100分)+1(用于存储分数溢出时的错误标志) #define STUDENT_GRADE_MIN 0 // 学生成绩的最小值(假设为0分)+1(用于存储分数溢出时的错误标志) #define STUDENT_NUM 5 // 学生数量(可以根据需要修改)+1(用于存储数组下标溢出时的错误标志)+1(用于存储数组下标溢出时的错误标志)+1(用于存储数组下标溢出时的错误标志)+1(用于存储数组下标溢出时的错误标志)+1(用于存储数组下标溢出时的错误标志)+1(用于存储数组下标溢出时的错误标志)+1(用于存储数组下标溢出时的错误标志)+1(用于存储数组下标溢出时的错误标志)+1(用于存储数组下标溢出时的错误标志)+1(用于存储数组下标溢出时的错误标志)+1(用于存储数组下标溢出时的错误标志)+1(用于存储数组下标溢出时的错误标志)+1(用于存储数组下标溢出时的错误标志)+1(用于存储数组下标溢出时的错误标志)+1(用于存储数组下标溢出时的错误标志)+1(用于存储数组下标溢出时的错误标志)+1(用于存储数组下标溢出时的错误标志)+1(用于存储数组下标溢出时的错误标志)+1(用于存储数组下标溢出时的错误标志)+1(用于存储数组下标溢出时的错误标志)+1(用于存储数组下标溢出时的错误标志)+1(用于存储数组下标溢出时的最