线性表——单链表的魅力(1) 初始化、插入、删除和查询

1.单链表的存储结构

typedef int ElemType;// 定义数据类型,可根据需要进行其他类型定义
typedef struct Node {
	ElemType  data;// 数据域,存放数据
	struct node *next;// 指向下一个链表节点
}ListNode, * LinkList;

2.单链表的初始化

void InitList(LinkList* L)
{
	if ((*L = (LinkList)malloc(sizeof(ListNode))) == NULL)//为头结点分配一个储存空间
	{
		exit(-1);
	}
	(*L)->next = NULL;//将单链表的头结点指针域为空
}

3.判断单链表是否为空

int ListEmpty(LinkList L)
{
	if (L->next == NULL)    //如果链表为空
	{
		return 1;           //返回1
	}
	else
	{
		return 0;           //返回0
	}
}

4.按序号查找

//查找单链表中的第i个结点。查找成功返回该结点的指针,否则返回NULL
ListNode* Get(LinkList L, int i)
{
	ListNode* p;
	int j;
	if (ListEmpty(L))//判断传的值是否为空
		return NULL;
	if (i < 1)      //判断要插入的结点位置是否存在
		return NULL;
	j = 0;
	p = L;
	while (p->next != NULL && j < i)//通过循环找到要找的第i个结点
	{
		p = p->next;
		j++;
	}
	if (j == i)
		return p;//返回指针p
	else
		return NULL;
}

5.按内容查找

//查找单链表中元素值为e的元素,查找成功则返回对应元素的指针,否则返回Null
ListNode* LocateElem(LinkList L, ElemType e)
{
	ListNode* p;
	p = L->next;		//指针p指向第一个结点
	while (p)
	{
		if (p->data != e)	//如果查出的值与e不相等
			p = p->next;	//继续下一个的查找  一致查到最后一个元素为Null为止
		else
			break;   
	}
	return p;				//返回查出来的指针p
}

6.定位操作 通过定位找到序号

int LocatePos(LinkList L,ElemType e)
{
	ListNode* p;
	int i;
	if (ListEmpty(L))  //查找第i个元素之前,判断链表是否为空
		return 0;
	p = L->next;//从第一个结点开始
	i = 1;
	while (p)
	{
		if (p->data == e)  //找到值与e相等的元素
			return i;		//返回对应的序号
		else
		{
			p = p->next;
			i++;
		}
	}
	if (!p)					//如果没有找到e,返回0,表示失败
	{
		return 0;
	}

}

7.单链表读取 通过位置找到对应的元素

int GetElem(LinkList L, int i, ElemType& e)
{
	int j;
	LinkList p;
	p = L->next;		//初始化让P指向第一个结点
	j = 1;
	while (p && j < i)   //查找到第i个元素
	{
		p = p->next;
		++j;
	}
	if (!p || j > i)
	{
		return 0;
	}
	e = p->data;		//获取查找到指针对应的数据
	return 1;
}

8.单链表插入
在这里插入图片描述

//将元素e插入到链表的指定位置i
int InsertList(LinkList * L,int i,ElemType e)
{
	int j;
	LinkList p, q;
	p = *L;      //初始化
	j = 1;
	while (p->next!=NULL&&j<i)  //找到第i-1个结点,即第i个结点的前驱节点
	{
		p = p->next;
		j++;
	}
	if (!p || j > i)
	{
		return 0;
	}
	q = (LinkList)malloc(sizeof(Node));		//生成新的结点
	q->data = e;							//将数据赋值给新的结点
	q->next = p->next;						//将p的后继结点赋值给q后继
	p->next = q;							//将q赋值到p的后继
	return 1;
}

9.单链表的删除
在这里插入图片描述

//将元素e从链表的指定位置i删除
int DeteleList(LinkList *L,int i,ElemType e)
{
	int j;
	LinkList p, q;
	p = *L;      //初始化
	j = 1;
	while (p->next != NULL && j < i)  //找到第i-1个结点,即第i个结点的前驱节点
	{
		p = p->next;
		j++;
	}
	if (!p || j > i)
	{
		return 0;
	}
	q = p->next;     //将要删除的指针赋值给q
	e = q->data;	//从而查出要删除的q的数据,进行赋值给e
	p->next = q->next; //此时p->next=p->next->next  将前驱结点的指针指向要删除的结点的下一个结点
	free(q);
	return 1;
}

10.销毁单链表
v

oid DestroyList(LinkList * L)
{
	LinkList p, q;
	p = (*L)->next;
	while (p)
	{
		q = p;
		p = p->next;
		free(q);
	}
}

11.求单链表的表长

int ListLength(LinkList L)
{
	LinkList p;
	int count = 0;
	p = L;
	while (p->next!=NULL)
	{
		p = p->next;
		count++;
	}
	return count;
}

后续:https://blog.csdn.net/wh1236666/article/details/108798683

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值