2021-3-30 数据结构

这篇博客记录了作者在2021年3月30日学习数据结构的目标和内容,重点是线性表的结构定义、查找操作以及链表的建立方法,包括顺序查找、头插法和尾插法。学习产出包括了相关数据结构的基本操作和例题解析。参考书目为《2022数据结构高分笔记》。
摘要由CSDN通过智能技术生成

@数据结构(考研向)

学习目标:

线性表

学习内容:

1:线性表的结构定义(单链表的结点定义,双链表的结点定义)
2:线性表的查找(顺序查找,数据查找)
3:建立链表(头插法 尾插法)

学习时间:

2021.3.30
11:30-12:30
21:30-22:10

学习产出:

*基本操作
初始化(顺序表);


void initList(Sqlist& L)                           //将顺序表初始化
{
	L.length = 0;
}

顺序表结构定义:

#define maxSize 100 //定义一个整数类型maxSize,值为100
typedef struct      //顺序表结构定义
{
	int data[maxSize]; //存放元素的数组

	int length; //定义长度

}Sqlist;

单链表结点定义:

typedef struct LNode //单链表结点定义
{
	int data;
	struct LNode *next; 

}LNode;

双链表结点定义:

typedef struct DLNode  //双链表结点定义
{
	int data;
	struct DLNode* prior;//指向前驱结点
	struct DLNode* next; //指向后驱结点

}DLNode;

顺序表的操作
例题:

//eg1:插入一个元素,并保持原有排序(两步:1 查找    2插入)
int findElem(Sqlist L, int x)//找到这个元素
{
	int i;
	for (i = 0; i < L.length; ++i)
	{
		return i;//从0到i{max}依次查找
	}
	return i;

顺序表的插入:

void insertElem(Sqlist &L,int x)//插入函数
{
	int p, i;
	p = findElem(L, x);                            //查找函数 ,如上
	for (i = L.length - 1; i >= p; --i)            //将顺序表后面的数字依次后移一位
		L. data[i + 1] = L.data[i];
	L.data[p] = x;                                 //将x放到p位置上
	++(L.length);                                  //顺序表的表长加1

按照data来查找:


//按照元素大小(值)来查找: 查找一个值等于e的元素 输出位置
int findElem(Sqlist L, int e)                      //找到这个元素
{
	int i;
	for (i = 0; i < L.length; ++i)                 //i依次加一,判断值得大小是否相等
		if (e == L.data[i])
			return i;
	return -1;	
}

单链表的操作
例题:

//eg1 将a和b两个链表和成一个链表c    (p27  2.2.3)
void merge(LNode* A, LNode* B, LNode*& C)
{
	LNode* p = A->next;                            //p来跟踪a的最小值
	LNode* q = B->next;                            //q来跟踪b的最小值
	LNode* r;                                      //指向c的终端
	C = A;                                         //用a来做c的头结点  也可以c=b;
	C->next = NULL;                                //可以忽略,前提是if语句必须执行一个
	free(B);
	r= C;
	while (p != NULL && q != NULL)                 //当p和q都不空的时候,较小的变成c的结点插入c
	{
		if (p->data <= q->data)
		{
			r->next = p; p = p->next;
			r = r->next;

		}
		else
		{
			r->next =q; q = q->next;
			r = r->next;

		}

	}
	r->next = NULL;
	if (p != NULL)                                 //将a的剩余结点插入c
	{
		r ->next = p;
	}
	if (q != NULL)                                 //将b的剩余结点插入c
	{
		r ->next = q;
	}
}

单链表的建立(尾插法):

//尾插法建立单链表
void createListR(LNode *& C, int a[], int n)       //要改变数据 *&c
{
	LNode * s, * r;                                //s指向新申请的结点 r指向终端的结点
	int i;
	C = (LNode*)malloc(sizeof(LNode));             //申请c的头结点空间
	C->next = NULL;
	r = C;                                         //将r指向结点 现在链表只有一个头结点
	for (i = 0; i < n; ++i)
	{
		s = (LNode*)malloc(sizeof(LNode));         //依次申请结点空间
		s->data = a[i];
		r->next = s;
		r = r->next;

	}
	r->next = NULL;

}

头插法:

//头插法建立单链表
void createListF(LNode*& C, int a[], int n)
{
	LNode* s, * r;
	int i;
	C = (LNode*)malloc(sizeof(LNode));
	C->next = NULL;
	r = C;
	for (i = 0; i < n; ++i)
	{
		s = (LNode*)malloc(sizeof(LNode));
		s->data = a[i];
		s->next = C->next;                        // s指向c的开始结点     
		C->next = s;                              // 头结点指针next指向s 
	}
	r->next = NULL;
}

例题:

//eg2 p31 例2-4
//链表中的结点查找  从表头到表尾  并删除这个结点
int findAndDelete(LNode* C, int x)
{
	LNode* p, * q;
	p = C;
	                                              //查找开始
	while (p->next != NULL)
	{
		if (p->next->data == x)
		{
			break;
			p = p->next;                          //查找结束

		}
		if (p ->next == NULL)
		{
			return 0;
		}
		else                                      //删除部分
	    {
			q = p->next;
			p->next = p->next->next;
			free(q);
			return 1;
		}
	}
}

参考书目

《2022数据结构高分笔记》 ——率辉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值