考研数据结构——C语言实现单链表

  1. 定义了一个结构体node,它包含一个整型数据data和一个指向下一个节点的指针next。这个结构体用于表示链表中的每个节点。

  2. Linknode结构体的指针类型,用于指向链表中的节点。

  3. displayNode函数用于遍历链表并打印每个节点的数据。它接受一个链表的头节点head作为参数,然后从头节点的下一个节点开始遍历,直到链表结束。

  4. length函数用于计算链表的长度。它从头节点的下一个节点开始遍历,每遍历一个节点,计数器count就增加1,直到链表结束。

  5. queryNode函数用于在链表中查找值为x的节点。如果找到,它将打印该节点的数据并返回0;如果未找到,返回-1。

  6. insertNode函数用于在链表的第index个位置插入一个新的节点,该节点的数据为item。如果插入成功,返回0;如果插入位置无效(即index超出链表长度),返回-1。

  7. deleteNode函数用于删除链表中值为x的节点。如果删除成功,返回0;如果没有找到值为x的节点,返回-1。

  8. 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值