下面是详细讲解“C语言实现线性动态(单向)链表的示例代码”的完整攻略:
线性动态(单向)链表是什么?
线性动态(单向)链表是一种动态数据结构,由若干个节点组成。每个节点包含两个部分:数据部分和一个称为指针的部分。指针指向下一个节点,最后一个节点指向空地址(NULL)。链表起始点称为头节点,最后一个节点称为尾节点。
实现步骤
1. 定义节点结构体
定义节点结构体,并包含数据和指向下一个节点的指针。示例代码如下:
typedef struct Node{
int data;
struct Node *next;
} ListNode;
2.创建链表
创建链表需要分配头节点内存,将头节点指针指向空。示例代码如下:
ListNode *createList(){
ListNode *head = (ListNode *)malloc(sizeof(ListNode));
head->next = NULL;
return head;
}
3.插入节点
插入节点需要找到要插入的位置,将新节点插入到该位置后面,然后修改相应节点的指针。示例代码如下:
void insert(ListNode *head, int data, int position) {
ListNode *p = head;
int i = 0;
while (p != NULL && i < position - 1) {
p = p->next;
++i;
}
if (p == NULL || i > position - 1) {
printf("插入位置错误!\n");
return;
}
ListNode *node = (ListNode *)malloc(sizeof(ListNode));
node->data = data;
node->next = p->next;
p->next = node;
}
4.删除节点
删除节点操作需要找到要删除的节点,并修改相邻节点的指针。示例代码如下:
void delete(ListNode *head, int position) {
ListNode *p = head;
int i = 0;
while (p != NULL && i < position - 1) {
p = p->next;
++i;
}
if (p == NULL || p->next == NULL || i > position - 1) {
printf("删除位置错误!\n");
return;
}
ListNode *del = p->next;
p->next = del->next;
free(del);
}
5.遍历链表
遍历链表就是依次访问每个节点,并输出节点的数据。示例代码如下:
void traverseList(ListNode *head) {
ListNode *p = head->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
6.销毁链表
销毁链表需要释放链表的每个节点的内存空间,最后释放头节点的内存空间。示例代码如下:
void freeList(ListNode *head) {
ListNode *p = head;
while (p != NULL) {
ListNode *tmp = p;
p = p->next;
free(tmp);
}
}
示例说明
示例1
在控制台终端下,通过调用以上定义的函数,实现链表节点的插入与删除,并通过遍历链表输出链表的每个节点的数据。示例代码如下:
#include <stdio.h>
#include <stdlib.h>
#include "list.h"
int main() {
ListNode *head = createList();
insert(head, 10, 1);
insert(head, 20, 2);
insert(head, 30, 3);
traverseList(head);
delete(head, 2);
traverseList(head);
freeList(head);
return 0;
}
示例2
在控制台终端下,通过读入文件来创建链表,之后对链表进行操作。示例代码如下:
#include <stdio.h>
#include <stdlib.h>
#include "list.h"
int main() {
ListNode *head = createList();
FILE *fp = fopen("data.txt", "r+");
if (fp == NULL) {
printf("Failed to open data file.");
exit(0);
}
int data, pos;
char op;
while (fscanf(fp, "%c,%d,%d\n", &op, &pos, &data) != EOF) {
if (op == 'I') {
insert(head, data, pos);
} else if (op == 'D') {
delete(head, pos);
}
}
fclose(fp);
traverseList(head);
freeList(head);
return 0;
}
以上就是“C语言实现线性动态(单向)链表的示例代码”的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现线性动态(单向)链表的示例代码 - Python技术站