数据结构——链表

链表:

定义:


typedef int SListDataType;
typedef struct  SListNode {
	SListDataType	value;	// 保存的值
	struct SListNode* next;	// 保存下一个结点的地址
} SListNode;

typedef struct SHead {        //头结点
	SListNode* 	first;
}SHead;

功能实现:

1.初始化

//1.初始化
int chushihua(SHead* f) {
	assert(f!=NULL);
	f->first = NULL;
}

2.头插

//2.头插
int HeadInsert(SHead* s, SListDataType date) {
	//先给数据船创建新的结点
	SListNode* node = (SListNode*)malloc(sizeof(SListNode));
	node->value = date;		//结点的数据是5
	node->next = s->first;		//结点的下一个地址,头结点放的就是第一个元素的地址,注意first是地址
	s->first = node;	//这时候把头节点first指向新插入的node
	return 0;
}	

3.尾插


//3.尾插
int EndInsert(SHead* s,SListDataType date) {
	//先给数据船创建新的结点
	SListNode* node = (SListNode*)malloc(sizeof(SListNode));
	node->value = date;
	node->next = NULL;
	//边界判断
	//链表为空的时候
	if (s->first==NULL) {
		s->first = node;	//插入数据,就第一个就是
		return;
	}

	//链表至少有一个节点的情况
	//这时候寻找最后一个节点的位置
	SListNode* arr = s->first;  //临时变量
	while (arr->next!=NULL) {
		arr = arr->next;
	}
	// arr->next 一定是  NULL,也就是最后一个结点
	//找到之后,最后一个结点指向新插入的数据
	arr->next = node;
}

4.头删

//4.头删
int HeadDelete(SHead* s) {
	//边界判断
	//如果链表不存在?如果链表没有结点,没东西删除?
	assert(s != NULL);  //链表不存在判断
	assert(s->first != NULL);	//链表没有结点判断

	SListNode* cur = s->first->next; //创建一个临时变量
	free(s->first); //释放掉头节点
	s->first = cur; //头节点重新赋值
	return 0;
}

5.尾删


//5.尾删
int EndDelete(SHead* s) {
	//边界判断
	//1.链表为空
	assert(s->first != NULL);
	//2.链表不存在
	assert(s != NULL);
	//3.链表只有一个元素
	if (s->first->next==NULL) {
		free(s->first);
		s->first = NULL;
		return;
	}
	//找倒数第二个结点,利用临时结点变量
	SListNode* arr = s->first;
	while (arr->next->next!=NULL) {
		arr = arr->next;
	}
	//这时候arr就是倒数第二个结点
	arr->next = NULL;//指向空
	free(arr->next);
	return 0;
}

6.按值查询


//6.按值查询
struct SListNode* SearchSList(SHead* s,SListDataType date) {   
	//边界判断
	//1.链表不存在
	assert(s != NULL);
	//2.链表为空
	assert(s->first != NULL);

	//注意返回值,返回值是地址,所以用的struct SListNode* ,就是next一样 放的地址
	SListNode* cur = s->first;
	for (cur = s->first; cur->next != NULL;cur=cur->next) {
		if (cur->value = date) {
			return cur;
		}
		
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值