408数据结构线性表2

本文详细介绍了单链表的基本操作,包括头插法创建链表,按序号和值查找节点,以及尾插法添加元素。头插法通过不断将新节点插入链表头部实现逆序,按序号查找返回指定位置节点,尾插法则在链表尾部添加新节点。这些概念对于理解链表和数据结构至关重要,实践编写代码能加深理解。
摘要由CSDN通过智能技术生成


一、单链表的定义

线性表的链式存储

typedef struct LNode{//typedef用于重命名一个数据类型
	int data;//数据
	struct LNode *next;//指向下一个节点的指针
}LNode,*LinkList;

二、基本操作

1.头插法

代码如下(示例):

LinkList Insert_Head(LinkList &L){
	LNode *s;int x;
	L=(LinkList)malloc(sizeof(LNode));
	L->next=NULL;
	scanf("%d",&x);
	while(x!=9999){
		s=(LNode *)malloc(sizeof(LNode));
		s->data=x;//将x赋值给s指针中的数据对象
		s->next=L->next;//将s指针中的下一个节点对象连接到L的next上
		L->next=s;//将s装进L的next里面
	}
	return L;
}

以下图片仅为个人记忆方法和逻辑理解
王道书中的图片是那种连接的锁链结构,但是个人觉得应该是这种嵌套结构,第一个节点放进链表头结点的next指针中,再插入新节点时,将之前放进去的节点掏出来放进新的节点next指针中,再将这个新节点放进链表头结点的next指针中
在这里插入图片描述

2.按序号/值查找节点值

从第一个节点出发,直到找到第i个节点为止,超出范围返回最后一个节点的指针域NULL
代码如下(示例):

LNode *GetElem(LinkList L,int i){
	int j=1;
	LNode *p=L->next;//定义一个指向头节点指针域的指针
	if(i==0)
		return L;
	if(i<0)
		return NULL;
	while(P!==NULL&&j<i){
		p=p->next;
		j++;
	}
	return p;
}

//按值查找
LNode *LocateElem(LinkList L,int e){
	LNode *p=L->next;
	while(p!=NULL&&p->data!=e){
		p=p->next;
	}
	return p;
}

3.尾插法

LinkList Insert_Tail(LinkList &L){
	LNode *s,*r;int x;
	L=(LinkList)malloc(sizeof(LNode));
	L->next=NULL;
	r=L;
	scanf("%d",x);
	while(x!=9999){
		s=(LNode *)malloc(sizeof(LNode));
		s->data=x;
		r->next=s;
		r=s;
		scanf("%d",x);
	}
	r->next=NULL;
	return L;
}

仅个人理解方式和记忆方法
与头插法的不同在于将新节点放入链表头结点的next指针中后,又定义了一个节点类型的指针r,将r指向放入链表头结点的next指针中的新节点
在这里插入图片描述

总结

对于链表部分的学习,个人认为写代码要比看懂更加重要,像头插法的思想可以用于将原链表进行逆置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值