单链表的基本操作代码

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单链表的基本操作代码

1. 什么是单链表

单链表是一种常见的数据结构,由多个节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。每个节点都只知道下一个节点的地址,而不知道前驱节点的地址。单链表中的第一个节点称为头结点,最后一个节点称为尾节点。单链表的基本操作包括插入、删除、查找等。

2. 单链表的节点定义

在编写单链表的基本操作代码之前,我们首先需要定义单链表的节点结构。一个节点包含两部分信息:数据元素和指向下一个节点的指针。

typedef struct Node {

int data; // 数据元素

struct Node* next; // 指向下一个节点的指针

} Node;

3. 创建单链表

创建单链表的基本操作是不断在链表的末尾添加节点,直至达到指定的长度。下面是创建单链表的代码示例:

Node* createList(int length) {

Node* head = NULL; // 头结点

Node* tail = NULL; // 尾节点

for (int i = 0; i < length; i++) {

Node* newNode = (Node*)malloc(sizeof(Node));

printf("请输入第 %d 个节点的数值:", i + 1);

scanf("%d", &(newNode->data));

newNode->next = NULL;

if (head == NULL) {

head = newNode;

tail = newNode;

} else {

tail->next = newNode;

tail = newNode;

}

}

return head;

}

以上代码中,我们通过循环输入节点的数据元素,并依次添加到链表的末尾。首先创建一个空链表,并使用head和tail两个指针分别指向头结点和尾节点。每次添加节点时,我们将其设置为尾节点,更新tail指针即可。

4. 遍历单链表

遍历单链表是指依次访问链表中的每个节点,并对其进行操作或输出。下面是遍历单链表的代码示例:

void traverseList(Node* head) {

Node* p = head;

while (p != NULL) {

printf("%d ", p->data);

p = p->next;

}

}

以上代码中,我们使用一个指针p初始化为头结点,并进行循环遍历。每次迭代时,输出当前节点的数据元素,并将指针p更新为下一个节点。

5. 在单链表中插入节点

在单链表中插入节点是指在指定位置之前插入一个新的节点。具体的插入操作需要考虑两种情况:插入位置为头结点和插入位置为其他节点。

以下是在单链表中插入节点的代码示例:

void insertNode(Node* head, int position, int value) {

Node* p = head;

Node* newNode = (Node*)malloc(sizeof(Node));

newNode->data = value;

newNode->next = NULL;

if (position == 0) { // 插入位置为头结点

newNode->next = head;

head = newNode;

} else { // 插入位置为其他节点

for (int i = 0; i < position - 1 && p != NULL; i++) {

p = p->next;

}

if (p == NULL) {

printf("插入位置无效!\n");

return;

}

newNode->next = p->next;

p->next = newNode;

}

}

以上代码中,我们首先根据插入位置创建一个新的节点,并将其值设置为指定值。然后,我们分别考虑了插入位置为头结点和其他节点的情况。如果插入位置为头结点,我们将新节点的指针指向原头结点,并将头指针指向新节点。如果插入位置为其他节点,我们需要遍历链表找到插入位置的前一个节点,并进行相应的插入操作。

6. 在单链表中删除节点

在单链表中删除节点是指从链表中删除指定位置的节点。具体的删除操作也需要考虑两种情况:删除位置为头结点和删除位置为其他节点。

以下是在单链表中删除节点的代码示例:

void deleteNode(Node** head, int position) {

Node* p = *head;

if (position == 0) { // 删除位置为头结点

*head = (*head)->next;

free(p);

} else { // 删除位置为其他节点

Node* prev = NULL;

for (int i = 0; i < position && p != NULL; i++) {

prev = p;

p = p->next;

}

if (p == NULL) {

printf("删除位置无效!\n");

return;

}

prev->next = p->next;

free(p);

}

}

以上代码中,我们分别考虑了删除位置为头结点和其他节点的情况。如果删除位置为头结点,我们首先将头指针指向下一个节点,并释放原头结点的内存空间。如果删除位置为其他节点,我们需要遍历链表找到指定位置的节点,并记录其前一个节点。然后,将前一个节点的指针指向要删除节点的下一个节点,并释放要删除节点的内存空间。

7. 单链表的查找操作

在单链表中进行查找操作是指查找给定值的节点,并返回其位置或相关信息。单链表的查找操作包括按值查找和按位置查找两种方式。

以下是单链表的查找操作的代码示例:

int findNodeByValue(Node* head, int value) {

Node* p = head;

int position = 0;

while (p != NULL && p->data != value) {

p = p->next;

position++;

}

if (p == NULL) {

return -1; // 未找到指定值的节点

}

return position;

}

Node* findNodeByPosition(Node* head, int position) {

Node* p = head;

for (int i = 0; i < position && p != NULL; i++) {

p = p->next;

}

相关文档
最新文档