#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* next;
};
typedef struct Node node;
node* createNode(int data) {
node* newNode = (node*)malloc(sizeof(node));
newNode->data = data; newNode->next = NULL;
return newNode;
}
void insertAtBeginning(node** headRef, int data) {
node* newNode = createNode(data);
newNode->next = *headRef; *headRef = newNode;
}
void insertAtEnd(node** headRef, int data) {
node* newNode = createNode(data);
if (*headRef == NULL) {
*headRef = newNode; return;
}
node* temp = *headRef;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
}
void deleteNode(node** headRef, int key) {
node* temp = *headRef;
node* prev = NULL;
if (temp != NULL && temp->data == key) {
*headRef = temp->next;
free(temp); return;
}
while (temp != NULL && temp->data != key) {
prev = temp; temp = temp->next;
}
if (temp == NULL) {
printf("Node with key %d not found.\n", key);
return;
}
prev->next = temp->next;
free(temp);
}
void printList(node* head) {
node* temp = head; while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
int main() {
node* head = NULL;
insertAtBeginning(&head, 3);
insertAtBeginning(&head, 2);
insertAtEnd(&head, 4);
insertAtEnd(&head, 5);
printList(head);
deleteNode(&head, 2);
printList(head);
deleteNode(&head, 6);
printList(head);
return 0;
}
我的代码实现了单向链表的常见操作,包括创建新节点、在链表头部和尾部插入节点、删除特定节点以及打印整个链表。
学习链表的实现需要理解链表的基本概念和操作。链表是一种数据结构,它由一系列节点组成,每个节点都包含数据和指向下一个节点的指针。相比于数组,链表的大小可以动态变化,但是访问链表中的元素需要遍历整个链表。在学习链表的实现过程中,需要理解以下几个关键概念:
节点:链表中的基本单元,每个节点包含数据和指向下一个节点的指针。
头节点:链表中的第一个节点,通常用一个指针变量表示整个链表。
尾节点:链表中的最后一个节点,它的指针指向 NULL。
遍历:访问链表中的所有节点,通常使用循环结构实现。
插入:这个函数的实现与插入节点到链表头部的函数类似,首先创建新节点,然后找到链表末尾并将其指针指向新节点。如果链表为空,则将新节点作为链表的头节点。
学习总结:
学习链表实现的过程中,需要注意以下几个方面:
1 熟悉指针的概念和使用方法。链表中的每个节点都包含一个指向下一个节点的指针,因此在操作链表时需要频繁使用指针。
2 熟悉动态内存分配的方法。链表的大小可以动态变化,因此需要使用动态内存分配函数(如malloc)来分配节点的内存空间。
3 注意边界情况的处理。在插入、删除、遍历等操作中,需要特别注意链表为空或只包含一个节点的情况。
4 理解链表的基本操作和算法。链表的基本操作包括插入、删除、遍历等,还有一些高级算法如快慢指针和递归等,这些都是学习链表实现的重点。