C语言中单向链表:创建节点与插入新节点
一. 简介
单链表是一种常见且基础的数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针。
本文简单学习一下C语言中如何实现单项链表。
二. C语言实现单向链表
单向链表:单向链表是一种线性数据结构,由一系列节点组成,每个节点包含两部分:
数据域:存储实际的数据。
指针域:存储指向下一个节点的地址。
单向链表关键点在于:每个节点只有一个指向下一个节点的指针,没有指向前一个节点的指针。
1. 定义链表节点,创建新节点
要实现单链表,首先要定义节点的结构,节点通常包含数据和指向下一个节点的指针。
#include <stdio.h>
#include <stdlib.h>
//定义链表节点
typedef struct Node {
int data;
struct Node* next;
} Node;
创建新节点时,需要为其分配内存,并初始化数据和指针:
//创建链表新节点
Node* create_list(int data) {
Node* head = (Node*)malloc(sizeof(Node));
if(head == NULL) {
printf("malloc error!\n");
exit(1);
}
head->data = data;
head->next = NULL;
return head;
}
2. 插入节点
插入节点的操作,可以在链表头部,或者指定位置,尾部进行插入。下面实现像链表头部,尾部插入节点。
(1) 向链表头插入新节点:
//向链表头部插入新节点
Node* insert_at_list_head(Node* head, int data) {
Node* new_node = create_list(data);
new_node->next = head;
return new_node;
}
(2) 向链表尾部插入新节点:
//向链表尾部插入新节点
Node* insert_at_list_end(Node* head, int data) {
Node* new_node = create_list(data);
if (head == NULL) {
return new_node;
}
//找到链表尾部
Node* st_p = head;
while(st_p->next != NULL) {
st_p = st_p->next;
}
st_p->next = new_node;
return head;
}
(2) 向链表的指定位置插入新节点:
//在链表的指定位置插入新节点
Node* insert_at_list_middle(Node* head, int data, int position) {
int i = 0;
Node* new_node = create_list(data);
//如果插入的位置是头部
if(position == 0) {
return insert_at_list_head(head, data);
}
//遍历到指定位置的前一个节点
Node* tmp_p = head;
for(i=0; i < position-1 && tmp_p->next != NULL; i++) {
tmp_p = tmp_p->next;
}
//如果插入位置超过链表长度,则不进行插入
if(tmp_p->next == NULL) {
free(new_node);
return head;
}
//在指定位置插入新节点
new_node->next = tmp_p->next;
tmp_p->next = new_node;
return head;
}
下一篇继续学习C语言中对于链表的操作。例如,在链表中查找某个节点,删除链表中某个节点,遍历链表,释放链表等等操作。