链表的基本概念
链表是一种线性数据结构,它的每个元素都包含两个部分:数据域和指针域,数据域用于存储数据,指针域用于存储下一个元素的地址,链表的第一个元素称为头节点,最后一个元素的指针域指向空(NULL),表示链表的结束,链表的优点是可以动态地添加和删除元素,缺点是访问某个元素需要从头节点开始遍历,效率较低。
链表的创建
1、定义链表结点结构体
typedef struct Node { int data; // 数据域,存储数据 struct Node *next; // 指针域,存储下一个结点的地址 } Node;
2、创建头节点
Node *head = (Node *)malloc(sizeof(Node)); if (!head) { printf("内存分配失败! "); exit(0); } head->next = NULL; // 将头节点的指针域设置为空,表示链表的结束
3、向链表中插入元素
Node *newNode = (Node *)malloc(sizeof(Node)); // 分配新结点的内存空间 if (!newNode) { printf("内存分配失败! "); exit(0); } newNode->data = value; // 为新结点的数据域赋值 newNode->next = head->next; // 将新结点的指针域指向头节点的下一个结点 head->next = newNode; // 将头节点的指针域更新为新结点
4、从链表中删除元素
Node *temp = head->next; // 用临时变量保存头节点的下一个结点 while (temp != NULL) { // 当临时结点不为空时,继续循环 Node *preTemp = temp; // 用临时变量保存当前结点的前一个结点,用于删除操作后恢复原始顺序 if (temp->data == value) { // 如果当前结点的数据等于要删除的数据,跳出循环 preTemp->next = temp->next; // 将当前结点的指针域更新为下一个结点,实现删除操作 free(temp); // 释放当前结点的内存空间 break; // 跳出循环 } else { preTemp = temp; // 否则,将临时变量更新为当前结点,继续下一次循环 } temp = temp->next; // 将临时变量更新为当前结点的下一个结点,继续下一次循环 }
输入数据并显示链表元素
int main() { Node *head = (Node *)malloc(sizeof(Node)); // 创建头节点 int n, i; // n表示要插入的元素个数,i表示当前插入的元素序号 cin >> n; // 从标准输入读取要插入的元素个数 cin >> i; // 从标准输入读取当前插入的元素序号,初始值为0,表示从头节点开始插入 Node *p = head; // 用指针变量p指向头节点,方便后续操作 for (int j = 0; j < n; j++) { // 根据要插入的元素个数进行循环,每次插入一个元素到链表中 int value; // 用变量value存储要插入的元素值,从标准输入读取 cin >> value; // 从标准输入读取要插入的元素值 Node *newNode = (Node *)malloc(sizeof(Node)); // 为新结点分配内存空间 newNode->data = value; // 为新结点的数据域赋值为要插入的元素值 newNode->next = NULL; // 将新结点的指针域设置为空,表示链表的结束,因为是首次插入元素,所以不需要修改前一个结点的指针域 while (p->next != NULL && p->next->data < value) { // 当当前结点的下一个结点不为空且下一个结点的数据小于要插入的元素值时,将当前结点的指针域更新为下一个结点,继续查找合适的位置插入新结点 p = p->next; // 将当前结点的指针域更新为下一个结点,继续查找合适的位置插入新结点 } newNode->next = p->next; // 将新结点的指针域更新为当前结点的下一个结点,实现插入操作 p->next = newNode; // 将当前结点的指针域更新为新结点,实现插入操作 } p = head->next; // 将指针变量p指向头节点的下一个结点,方便后续操作显示链表元素 while (p != NULL) { // 当指针变量p不为空时,继续循环显示链表元素 cout << p->data << " "; // 将当前结点的数据域输出到标准输出流中,并在数据后面加上一个空格作为分隔符,实现显示链表元素的操作 p = p->next; // 将指针变量p更新为当前结点的下一个结点,继续下一次循环显示链表元素 } cout << endl; // 在链表元素显示完毕后,输出一个换行符,使输出结果更加美观易读,注意:这里没有使用相关问题与解答栏目,因为本文已经详细讲解了如何使用C语言创建链表并输入数据,如果有其他问题需要解答,请在本回答下方留言。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/264201.html