数据结构 王道

线性表

顺序表

#include<stdio.h>
#include<stdlib.h>

#define MaxSize 50  
typedef int ElemType; //顺序表中元素的类型
//静态分配
typedef struct {
	ElemType data[MaxSize]; //定义的数组,用来存元素
	int length;   //当前顺序表中有多少个元素
}SqList;


//i代表插入的位置,从1开始,e要插入的元素
bool ListInsert(SqList& L, int i, ElemType e) {
	if (i<1 || i>L.length + 1) return false;	//判断要插入的位置是否合法
	if (L.length >= MaxSize) return false;	//当前存储空间已满,不能插入
	for (int j = L.length; j >= i; j--) { //移动顺序表中的元素
		L.data[j] = L.data[j - 1];
	}
	L.data[i - 1] = e; //数组下标从零开始,插入第一个位置,访问的下标为0
	L.length++;
	return true;
}

//删除使用元素e的引用的目的是拿出对应的值
bool ListDelete(SqList& L, int i, ElemType& e) {
	if (i<1 || i>L.length) return false; //如果删除的位置是不合法
	e = L.data[i - 1];  //获取顺序表中对应的元素,赋值给e
	for (int j = i; j < L.length; j++) { //从i的位置依次把元素往前覆盖
		L.data[j - 1] = L.data[j];
	}
	L.length--; //删除一个元素,顺序表长度减1
	return true;

}



//查找成功,返回位置,位置从1开始,查到失败,返回0
int LocateElem(SqList L, ElemType e) {
	for (int i = 0; i < L.length; i++) {
		if (L.data[i] == e) return i + 1; //加1就是元素在顺序表中的位置
	}
	return 0;
}


void PrintList(SqList& L) {
	for (int i = 0; i < L.length; i++){
		printf("%4d", L.data[i]);
	}
	printf("\n");
}

int main() {

	SqList L;  //顺序表的名称
	bool ret; //查看返回值,布尔型是true,或者false
	ElemType del;//要删除的元素
	//首先手动在顺序表中赋值
	L.data[0] = 1;
	L.data[1] = 2;
	L.data[2] = 3;
	L.length = 3; //总计三个元素
	ret = ListInsert(L, 2, 60);
	if (ret) {
		printf("插入成功\n");
		PrintList(L);
	}else{
		printf("插入失败\n");
	}
	ret = ListDelete(L, 1, del);
	if (ret){
		printf("删除成功\n");
		printf("删除元素值为 %d\n",del);
		PrintList(L);
	}else{
		printf("删除失败\n");
	}
	int elel_pos = LocateElem(L, 60);
	if (elel_pos){
		printf("查找成功\n");
		printf("元素位置为 %d\n", elel_pos);
	}else{
		printf("查找失败\n");
	}
	return 0;
}

单链表

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>


typedef int ElemType;

typedef struct LNode{
	ElemType data;
	struct LNode* next; //指向下一个结点
}LNode,*LinkList;
//头插法新建链表
LinkList CreatList1(LinkList &L) {
	LNode* s; int x;
	L = (LinkList)malloc(sizeof(LNode));//带头结点的链表
	L->next = NULL; //L->data里面没放东西
	scanf("%d", &x); //从标准输入读取数据
	//3 4 5 6 7 9999
	while (x!=9999){
		s = (LNode*)malloc(sizeof(LNode));//申请一个空间,强制类型转换
		s -> data = x; //那读取到的值,给新空间中的data成员
		s->next = L->next;//让新结点的next指针指向链表的第一个元素
		L->next = s;//让s作为第一个元素
		scanf("%d", &x); //读取标准输入
	}
	return L;
}
//尾插法新建链表
LinkList CreatList2(LinkList& L) {
	int x;
	L = (LinkList)malloc(sizeof(LNode));//带头结点的链表
	LNode* s, * r = L; //LinkList s,r=L;也可以, r代表链表表尾结点,指向链表尾部
	scanf("%d", &x);
	//3 4 5 6 7 9999
	while (x != 9999) {
		s = (LNode*)malloc(sizeof(LNode));
		s->data = x; 
		r->next = s;//让尾部结点指向新结点
		r = s;//r指向新的表尾结点
		scanf("%d", &x); //读取标准输入
	}
	r->next = NULL;//尾结点的next指针赋值为NULL
	return L;
}
//按序号查找结点值
LNode* GetElem(LinkList L,int i) {
	int j = 1;
	LNode* p = L->next; //让p指向第一个结点
	if (i == 0) {
		return L;
	}
	if (i < 1) {
		return NULL;
	}
	while (p&&j<i){
		p = p->next;
		j++;
	}
	return p;
}
//按值查找
LNode* LocateElem(LinkList L, ElemType e) {
	LinkList p = L->next;
	while (p!=NULL && p->data !=e){
		p = p->next;
	}
	return p;
}
//新结点插入第i个位置
bool ListFrontInsert(LinkList L, int i, ElemType e) {
	LinkList p = GetElem(L, i - 1); //拿到要插入位置的前一个位置的地址值
	if (NULL == p) {
		return false;
	}
	LinkList s = (LNode*)malloc(sizeof(LNode)); //为新插入的结点申请空间
	s->data = e;
	s->next = p->next;
	p->next = s;
	return true;
 }
//删除第i个结点
bool ListDelete(LinkList L,int i) {
	LinkList p = GetElem(L, i - 1);
	if (NULL == p) {
		return false; //要删除的位置不存在
	}
	LinkList q;
	q = p->next;
	if (q == NULL) {//删除的元素不存在
		return false;
	}
	p->next = q->next; //断链
	free(q); //释放对应结点的空间
	q = NULL; //为了避免野指针
	return true;

}
//打印链表中每个结点的值
void PrintList(LinkList L) {
	L = L->next;
	while (L!=NULL){
		printf("%3d", L->data);
		L = L->next;
	}
	printf("\n");
}
int main() {
	LinkList L;//链表头,是结构体指针类型
	LinkList search;//用来存储拿到的某一个节点
	//CreatList1(L);//输入数据可以为3 4 5 6 7 9999
	CreatList2(L);//输入数据可以为3 4 5 6 7 9999
	PrintList(L); //链表打印
	search = GetElem(L, 2);//查找链表第二个位置的元素值
	if (search != NULL) {
		printf("按序号查找成功\n");
		printf("%d\n", search->data);
	}
	search = LocateElem(L, 6);//按值查询
	if (search != NULL)
	{ 
		printf("按值查找成功\n");
		printf("%d\n", search->data);
	}
	ListFrontInsert(L, 2, 99);//新结点插入第i个位置
	PrintList(L);
	ListDelete(L, 4); //删除第4个结点
	PrintList(L);
}

双向链表

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>


typedef int ElemType;

typedef struct DNode {
	ElemType data;
	struct DNode* prior, * next; //前驱,后继
}DNode, * DLinkList;
//双向链表头插法
DLinkList Dlist_head_insert(DLinkList& DL) {
	DNode* s; int x;
	DL = (DLinkList)malloc(sizeof(DNode));//带头结点的链表
	DL->next = NULL;
	DL->prior = NULL;
	scanf("%d", &x); //从标准输入读取数据
	//3 4 5 6 7 9999
	while (x != 9999) {
		s = (DNode*)malloc(sizeof(DNode));//申请一个空间,强制类型转换
		s->data = x; 
		s->next = DL->next;
		if (DL->next != NULL) {//插入第一个结点时,不需要这步操作
			DL->next->prior = s;
		}
		s->prior = DL;
		DL->next = s;
		scanf("%d", &x); 
	}
	return DL;
}
//双向链表尾插法新建链表
DLinkList Dlist_tali_insert(DLinkList& DL) {
	int x;
	DL = (DLinkList)malloc(sizeof(DNode));//带头结点的链表
	DNode* s, * r = DL; //r代表尾指针
	DL->prior = NULL;
	scanf("%d", &x);
	//3 4 5 6 7 9999
	while (x != 9999) {
		s = (DNode*)malloc(sizeof(DNode));
		s->data = x;
		r->next = s;
		s->prior = r;
		r = s;//r指向新的表尾结点
		scanf("%d", &x); //读取标准输入
	}
	r->next = NULL;//尾结点的next指针赋值为NULL
	return DL;
}
//按序号查找结点值
DNode* GetElem(DLinkList DL, int i) {
	int j = 1;
	DNode* p = DL->next; //让p指向第一个结点
	if (i == 0) {
		return DL;
	}
	if (i < 1) {
		return NULL;
	}
	while (p && j < i) {
		p = p->next;
		j++;
	}
	return p;
}
 
//新结点插入第i个位置
bool DListFrontInsert(DLinkList DL, int i, ElemType e) {
	DLinkList p = GetElem(DL, i - 1); //拿到要插入位置的前一个位置的地址值
	if (NULL == p) {
		return false;
	}
	DLinkList s = (DLinkList)malloc(sizeof(DNode)); //为新插入的结点申请空间
	s->data = e;
	s->next = p->next;
	p->next->prior = s;
	s->prior = p;
	p->next = s;
	return true;
}
//删除第i个结点
bool DListDelete(DLinkList DL, int i) {
	DLinkList p = GetElem(DL, i - 1);
	if (NULL == p) {
		return false; //要删除的位置不存在
	}
	DLinkList q = p->next;
	if (q == NULL) {//删除的元素不存在
		return false;
	}
	p->next = q->next; //断链
	if (q->next != NULL) {
		q->next->prior = p;
	}
	free(q); //释放对应结点的空间
	return true;

}
//打印链表中每个结点的值
void PrintDList(DLinkList DL) {
	DL = DL->next;
	while (DL != NULL) {
		printf("%3d", DL->data);
		DL = DL->next;
	}
	printf("\n");
}
int main() {
	DLinkList DL;
	DLinkList search;
	Dlist_head_insert(DL);
	//Dlist_tali_insert(DL);
	//3 4 5 6 7 9999
	PrintDList(DL); 
	search = GetElem(DL, 2);
	if (search != NULL) {
		printf("按序号查找成功\n");
		printf("%d\n", search->data);
	}
	DListFrontInsert(DL, 3, 99);
	PrintDList(DL);
	DListDelete(DL, 2);
	PrintDList(DL);
}

数据结构王道思维导图pdf》是一本以思维导图形式呈现的数据结构学习资料。这本资料以图解的方式对数据结构的概念、基本原理、常用数据结构和算法进行了清晰的整理和总结。 首先,这本思维导图详细介绍了数据结构的基本概念,包括数据、数据元素、数据项、数据对象等基本术语的定义和解释。它帮助读者建立和理解数据结构的基本知识框架。 其次,这本思维导图详细讲解了常见的数据结构,如线性表、栈、队列、串、数组、链表、树、图等,并通过图示和文字说明展示了它们的特点、操作和应用场景。这样的图示方式使得读者更容易理解和记忆这些数据结构的特点和应用。 另外,这本思维导图还涵盖了常用的数据结构算法,如排序、查找、哈希等。它详细介绍了这些算法的原理、实现方法和时间复杂度,帮助读者掌握和运用这些算法解决实际问题。 此外,这本思维导图还提供了一些典型的数据结构应用实例,帮助读者将理论知识应用到实际的问题中。这些实例包括树的遍历、图的最短路径、哈希表的应用等,通过这些实例的讲解,读者可以更好地理解和掌握数据结构的应用技巧。 总的来说,《数据结构王道思维导图pdf》是一本非常实用的学习资料。它通过思维导图的形式,清晰地将数据结构的概念、基本原理、常用数据结构和算法进行了整理和总结,使读者更易于理解和掌握数据结构的知识。同时,它也提供了一些典型的应用实例,帮助读者将理论知识应用到实际问题中。无论是初学者还是需要复习巩固的人,这本思维导图都是一个很好的学习工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值