链表各种操作的实现

导言

本文用C++实现了链表的创建、插入、删除、遍历、判断空链表等操作。当然根据大学课程安排,C++的学习可能在链表之后(或同时进行),不过本文提供的代码几乎没有涉及C++的特性,开辟内存空间也使用的是C语言的方法,除了输入输出的部分,本代码完全可以被认为是C语言描述。(我做的意大利面,即使是不能吃辣的人也能吃哦!)(?)

正文

头文件List.h的声明

#ifndef _List_H

struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;
typedef int ElementType;

int IsEmpty(List L);
int IsLast(Position P,List L);
Position Find(ElementType X, List L);
List Create();
void Delete(ElementType X, List L);
Position FindPrevious(ElementType X, List L);
void Insert(ElementType X, List L, Position P);
void DeleteList(List L);
void traverse(List L);

#endif

定义Node为链表节点的结构体
定义PtrToNode、List、Position均为指向节点的指针
定义节点中存储的数据类型是int型

Node的结构

本例及以下代码均放在.cpp文件中

//本实现全程默认链表带有头节点
struct Node {
	ElementType element;
	Position next;
};

element是节点存储的数据项
next是指向下一节点的指针

创建链表

//创建一个链表
List Create() {
	Position Header,TmpCell;
	Header = (Position)malloc(sizeof(struct Node));
	TmpCell = Header;
	
	int n;
	cout << "请输入元素个数:";
	cin >> n;
	cout << "请输入全部元素:";
	for(int i = 0; i < n; i++) {
		int X;
		cin >> X;
		Position P;
		P = (Position)malloc(sizeof(struct Node));
		P->element = X;
		P->next = NULL;
		TmpCell->next = P;
		TmpCell = TmpCell->next;
	}

	return Header;
}

判断空链表

//测试一个链表是否是空表
int IsEmpty(List L) {
	return L->next == NULL;
}

判断链表末尾

//测试当前位置是否为链表的末尾
int IsLast(Position P, List L) {
	return P->next == NULL;
}

查找元素

//返回X元素在链表中的位置;如果没找到返回NULL
Position Find(ElementType X, List L) {
	Position P = L->next;

	while (P->element != X&&P != NULL) {
		P = P->next;
	}

	return P;
}

删除元素

//删除链表中第一个出现的元素X
void Delete(ElementType X, List L) {
	Position P, TmpCell;

	P = FindPrevious(X, L);

	if (!IsLast(P, L)) {
		TmpCell = P->next;
		P->next = TmpCell->next;
		free(TmpCell);
	}
}

//返回元素X前面一个元素的位置
Position FindPrevious(ElementType X, List L) {
	Position P;

	P = L;
	while (P->next != NULL&&P->next->element != X) {
		P = P->next;
	}

	return P;
}

插入元素

插入元素的命令有多种形式,这里仅实现“在给定位置后插入”的功能

//在位置P之后插入元素X
void Insert(ElementType X, List L, Position P) {
	Position TmpCell;

	TmpCell = (Position)malloc(sizeof(struct Node));
	if (TmpCell == NULL)
		cout << "空间不足!" << endl;

	TmpCell->element = X;
	TmpCell->next = P->next;
	P->next = TmpCell;
}

删除整个链表

//删除整个链表
void DeleteList(List L) {
	Position P, TmpCell;

	P = L->next;
	L->next = NULL;
	while (P != NULL) {
		TmpCell = P->next;
		free(P);
		P = TmpCell;
	}
}

遍历链表

//遍历链表
void traverse(List L) {
	Position P = L->next;

	cout << "遍历:";

	while (P != NULL) {
		cout << P->element;
		if (P->next != NULL)cout << " ";
		P = P->next;
	}

	cout << endl;
}

运行演示

int main() {
	List L;
	L = Create();
	traverse(L);

	cout << "删除元素3" << endl;
	Delete(3, L);
	traverse(L);

	cout << "在开头插入元素5" << endl;
	Insert(5, L, L);
	traverse(L);

	return 0;
}

在这里插入图片描述

总结

本文实现了链表,比较适合供①已经了解链表特性但时间太久忘记实现细节②临近C语言课设作业ddl的朋友们参考。
参考资料:《数据结构与算法分析:C语言描述》(第二版)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值