单链表的链式储存与实现c语言代码
时间: 2024-09-13 18:02:24 浏览: 12
单链表是一种常见的数据结构,它通过节点之间的指针连接来存储数据。每个节点包含两部分信息:一部分是存储数据的域,另一部分是指向下一个节点的指针域。单链表的特点是只能单向访问,即从头节点开始,只能沿着链表遍历到尾节点,不能反向遍历。
下面是一个简单的单链表的C语言实现,包括链表节点的定义以及一些基本操作的函数实现,如创建节点、插入节点、删除节点和打印链表。
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点的结构体
typedef struct Node {
int data; // 数据域
struct Node *next; // 指针域,指向下一个节点
} Node;
// 创建一个新节点
Node* createNode(int data) {
Node *newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
printf("Memory allocation error!\n");
return NULL;
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 在链表的指定位置插入一个新节点
void insertNode(Node **head, int data, int position) {
Node *newNode = createNode(data);
if (*head == NULL) {
if (position == 1) {
*head = newNode;
return;
} else {
printf("Position out of bounds.\n");
free(newNode);
return;
}
}
Node *current = *head;
for (int i = 1; current != NULL && i < position - 1; i++) {
current = current->next;
}
if (current == NULL) {
printf("Position out of bounds.\n");
free(newNode);
return;
}
newNode->next = current->next;
current->next = newNode;
}
// 删除链表的指定位置的节点
void deleteNode(Node **head, int position) {
if (*head == NULL) {
printf("List is empty.\n");
return;
}
Node *temp = *head;
if (position == 1) {
*head = temp->next;
free(temp);
return;
}
for (int i = 1; temp != NULL && i < position - 1; i++) {
temp = temp->next;
}
if (temp == NULL || temp->next == NULL) {
printf("Position out of bounds.\n");
return;
}
Node *next = temp->next->next;
free(temp->next);
temp->next = next;
}
// 打印链表
void printList(Node *head) {
Node *temp = head;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
}
// 主函数
int main() {
Node *head = NULL; // 初始化链表为空
// 插入节点
insertNode(&head, 1, 1);
insertNode(&head, 2, 2);
insertNode(&head, 3, 3);
printList(head);
// 删除节点
deleteNode(&head, 2);
printList(head);
// 释放链表内存
while (head != NULL) {
Node *temp = head;
head = head->next;
free(temp);
}
return 0;
}
```
在这个例子中,我们定义了一个节点结构体`Node`,它有两个成员:一个整型的`data`和一个指向`Node`类型的指针`next`。我们还定义了几个操作链表的函数,包括创建新节点、在指定位置插入节点、删除指定位置的节点和打印链表。