-
定义了一个结构体
node
,它包含一个整型数据data
和一个指向下一个节点的指针next
。这个结构体用于表示链表中的每个节点。 -
Link
是node
结构体的指针类型,用于指向链表中的节点。 -
displayNode
函数用于遍历链表并打印每个节点的数据。它接受一个链表的头节点head
作为参数,然后从头节点的下一个节点开始遍历,直到链表结束。 -
length
函数用于计算链表的长度。它从头节点的下一个节点开始遍历,每遍历一个节点,计数器count
就增加1,直到链表结束。 -
queryNode
函数用于在链表中查找值为x
的节点。如果找到,它将打印该节点的数据并返回0;如果未找到,返回-1。 -
insertNode
函数用于在链表的第index
个位置插入一个新的节点,该节点的数据为item
。如果插入成功,返回0;如果插入位置无效(即index
超出链表长度),返回-1。 -
deleteNode
函数用于删除链表中值为x
的节点。如果删除成功,返回0;如果没有找到值为x
的节点,返回-1。 -
main
函数是程序的入口点,它演示了如何使用上述定义的函数来操作链表。
在main
函数中,首先创建了一个头节点head
,然后通过insertNode
函数插入了三个节点,数据分别为10、20和30。接着,使用displayNode
函数打印链表中的元素,使用length
函数打印链表长度,使用queryNode
函数查找值为20的节点,并根据查找结果打印相应信息。然后,使用deleteNode
函数删除值为20的节点,并再次打印链表中的元素。最后,通过一个循环释放链表中所有节点的内存。
#include <stdio.h>
#include <malloc.h>
typedef int ElemType;
typedef struct node {
ElemType data;
struct node* next;
}Node,*Link;
//遍历操作
void displayNode(Link head) {
Link p = head->next;
while (p != NULL) {
printf("%d\t", p->data);
p = p->next;
}
}
//求链表长度
int length(Link head) {
int count = 0;
Link p = head->next;
while (p != NULL) {
p = p->next;
count++;
}
return count;
}
//链表查找
int queryNode(Link head, ElemType x) {
Link p = head->next;
while (p != NULL) {
if (p->data == x) {
printf("%d", p->data);
return 0;
}
p = p->next;
}
return -1;
}
//链表插入
int insertNode(Link head, int index, ElemType item) {
int count = 0;
Link p = head;
Link node;
while (p != NULL && count < index - 1) {
p = p->next;
count++;
}
if (p == NULL) {
return -1;
}
else {
node = (Link)malloc(sizeof(Node));
node->data = item;
node->next = p->next;
p->next = node;
return 0;
}
}
//链表删除节点
int deleteNode(Link head, ElemType x) {
Link p = head;
Link pre = NULL;
while (p != NULL && p->data != x) {
pre = p;
p = p->next;
}
if (p == NULL) {
return -1; // 未找到值为x的节点
}
if (pre == NULL) { // 要删除的是头节点
head = head->next;
}
else {
pre->next = p->next;
}
free(p); // 释放节点内存
return 0;
}
int main() {
Link head = (Link)malloc(sizeof(Node)); // 创建头节点
head->next = NULL; // 初始化链表为空
// 插入一些节点
insertNode(head, 1, 10);
insertNode(head, 2, 20);
insertNode(head, 3, 30);
// 显示链表
printf("链表中的元素: ");
displayNode(head);
printf("\n");
// 查询链表长度
printf("链表长度: %d\n", length(head));
// 查找节点
printf("查找节点: ");
if (queryNode(head, 20) == 0) {
printf("找到值为20的节点\n");
}
else {
printf("未找到值为20的节点\n");
}
// 删除节点
printf("删除值为20的节点后: ");
deleteNode(head, 20);
displayNode(head);
printf("\n");
// 释放链表内存
Link p;
while (head != NULL) {
p = head;
head = head->next;
free(p);
}
return 0;
}