严蔚敏《数据结构》——链表

严奶奶版数据结构,我用C写一直报错,后来发现C中没有引用,只有指针。为了还原原版的味道.这里创建了.cpp的文件,加上了#include<cstdio>和#include<cstdlib>两个头文件,来还原原汁原味的严奶奶版数据结构中的算法。

/*线性表*/
#include<cstdio>
#include<cstdlib> 
#define ElemType int 
#define Status int 

typedef struct LNode {
	ElemType data;
	struct LNode* next;
}LNode,*LinkList;

链表初始化

Status InitList_L(LinkList& L) {
	L = new LNode;
	L->next = NULL;//第个节点为空
	return 0;
}

 查找第i个数的位次  p29 算法2.8 需要定义p、和j

Status GetElem(LinkList& L, int i, ElemType e) {
	LinkList p = L->next;//初始化,p指向第一个节点
	int j;
	j = 1;
	while (p && j < i) {
		p = p->next;
		++j;
	}
	if (!p || j > i) {
		printf("该元素在链表L中不存在!");
		return 0;
	}
	e = p->data;
	printf("第%d个元素的值为:%d", i, e);
	return 0;
}

在链表L第i个元素前插入元素e

Status ListInsert_L(LinkList& L,int i, ElemType e) {
	LinkList p = L;
	int j = 0;
	while (p && j < i - 1) {
		p = p->next;//沿着指针去寻找元素i的前一个结点
		j++;
	}
	//这时p的值为元素i的前一个值所在内存的地址
	if (!p || j > i - 1) printf("链表L中查无此值"); return 0;
	LinkList s = new LNode;		
	s = (LinkList)malloc(sizeof(ElemType));//生成新结点用于插入新元素
	s->data = e;//新节点的指针域赋值 
	s->next = p->next;//将e插入链表L中
	p->next = s;
	printf("元素%d插入成功!", e);
	return 0;
}

 删除链表L中的元素i,并由e返回其值

Status ListDelete_L(LinkList& L, int i, ElemType e) {
	LinkList p = L;
	int j = 0;
	while (p->next && j < i - 1) {
		p = p->next;
		++j;
	}
	if (!(p->next) || j > i + 1) printf("链表L中没有该元素!"); return 0;
	LinkList q = p->next;//新建结点用于存储需要删除的元素i
	p->next = q->next;//相当于 p->next是指向了i的地址,q存储了i的地址,q->next就是q指向了i下一个元素的地址
	e = q->data;
	free(q);//回收结点q
	printf("删除元素%d成功!", e);
	return 0;
}

逆序创建链表L

void CreateList_L(LinkList& L, int n) {
	InitList_L(L);
	int i;
	for (i = 0; i < n; i++) {
		LinkList p = new LNode;//新建一个结点
		scanf_s("%d", &p->data);
		p->next = L->next;//L->next 头结点指针
		L->next = p;
	}
	printf("链表创建成功!");
}

查找链表L中第一个值与元素e相等的元素位序

Status LocateElem(LinkList& L, int i, ElemType e) {
	LinkList p = L->next;
	int i, j;
	i = 1; j = 0;
	while (p != NULL) {
		if (p->data == e) {
			j = 1;
			break;
		}
		p = p->next;
		i++;
	}
	if (j) {
		printf("元素%d在链表L中的位序是:%d\n", e, i);
	}
	else {
		printf("链表L中没有该元素!");
	}
	return 0;
}

将链表L置为空表

Status ClearList_L(LinkList& L) {
	if (L->next = NULL) L->next = NULL;
	printf("链表置空成功!!");
	return 0;
}

查找链表L中元素cur_e的前驱并用pre_e返回

Status PriorElem_L(LinkList& L, ElemType cur_e, ElemType pre_e) {
	LinkList p = L->next;
	if (p->data = cur_e) {
		printf("元素%d是第一个元素,第一个元素没有前驱!", cur_e);
		return 0;
	}
	while (p && p->data != cur_e) {
		pre_e = p->data;
		p = p->next;
	}
	printf("在链表L中元素%d的前驱是%d\n", cur_e, pre_e);
	return 0;
}

//查找链表L中元素cur_e的后继元素,并用next_e返回该值

Status NextElem_L(LinkList L, ElemType cur_e, ElemType next_e) {
	LinkList p = L->next;		//初始化,p用于指向第一个结点
	while (p && p->data != cur_e) {
		p = p->next;
	}
	if (p->next == NULL) {
		printf("元素%d是第最后个元素,第一个元素没有后继!\n", cur_e, next_e);
	}
	else {
		next_e = p->next->data;
		printf("在链表L中元素%d的后继是%d\n", cur_e, next_e);
	}
	return 0;
}
int main() {
	/*此处省略10000字*/
}

main交给各位写了,我实现了没有问题的,有问题的请联系我。

学艺不精,若有错误还请多多指教,谢谢。

p.s.在使用Visual Studio编译器的时候输入scanf()方法要用scanf_s()

更多内容请移步公众号 手撕算法。谢谢

算法爱好者协会群:940100543,加入学习讨论。

所使用编译器为:Visual Studio2019 链接:https://pan.baidu.com/s/1eg8CNrqrP1jn7GRzHfYXxA
                                                                    提取码:1234

推荐新手使用dev cpp                        链接:https://pan.baidu.com/s       /1XZp_8lVE7X6tMLmvXRbYhw
                                                                     提取码:1234

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
数据结构(C语言版)》严蔚敏、吴伟民+课本算法源码与习题解析 其中算法源码与解析涵盖了《数据结构》课本和习题集两部分,.所有源码实现均使用C语言,遵循C99标准,使用C-Free 5(C-Free置gcc编译器,编译时,需要在菜单栏,定位到构建-->构建选项-->类别-->C Language,勾选第三个:"ISO C99 plus GNU extensions [-std=gnu99]",即编译选项用-std=gnu99,而不是-std=c89或者-std=c99)测试通过(不要在CFree里创建工程,如果确实想在工程里运行,那文件互相引用的方式需要改写)。为了便于引用、查阅,各章内容在计算机中分文件夹存放,其中,《▲课本算法实现》中存放对课本中算法的实现,《▼配套习题解析》存放对题集中习题的解答,各源文件按章、节组织,组织方式见附录二。 《数据结构》(C语言版)是为“数据结构”课程编写的教材,也可作为学习数据结构及其算法的C程序设计的参数教材。 本书的前半部分从抽象数据类型的角度讨论各种基本类型的数据结构及其应用;后半部分主要讨论查找和排序的各种实现方法及其综合分析比较。其内容和章节编排1992年4月出版的《数据结构》(第二版)基本一致,但在本书中更突出了抽象数据类型的概念。全书采用类C语言作为数据结构和算法的描述语言。 本书概念表述严谨,逻辑推理严密,语言精炼,用词达意,并有配套出版的《数据结构题集》(C语言版),便于教学,又便于自学。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爷傲|奈我何

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值