单链表的查找建立操作(C语言)

Posted bfhonor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单链表的查找建立操作(C语言)相关的知识,希望对你有一定的参考价值。

一、单链表的查找(带头结点)

(一)按位查找

  • GetElem(L,i)按位查找操作。获取表L中第i个位置的元素的值。
//按位查找,返回第i个元素(带头结点)
LNode * GetElem(LinkList L, int i){
	if(i<0)
		return NULL;
	LNode *p;		//指针p指向当前扫描到的结点
	int j=0;		//当前p指向的是第几个结点
	p = L;			//L指向头结点,头结点是第0个结点(不存储数据)
	while(p != NULL && j<i){//循环找到第i个结点
		p =p -> next;
		j++;
	}
	return p;
}
  • 边界情况:
    ①如果 i = 0
    在这里插入图片描述
  • ②如果 i = 8
    在这里插入图片描述

(二)按值查找

  • LocateElem(L,e)按值查找操作。在表L中查找具有给定关键字值的元素。
//按值查找,找到数据域==e 的结点
LNode * LocateElem(LinkList L,ElemType e){
	LNode *p = L -> next;
	//从第1个结点开始查找数据域为e的结点
	while(p != NULL && p -> data != e)
		p = p -> next;
	return p;//找到后返回该结点指针,否则返回NULL
}
  • ①、如果e=8:
    在这里插入图片描述
  • ②、如果e=6:
    在这里插入图片描述

1. 求表的长度

//求表的长度
int Length(LinkList L){
	int len = 0;//统计表长
	LNode *p = L;
	while(p -> next != NULL){
		p = p -> next;
		len++;
	}
	return len;
}

二、单链表的建立

(一)尾插法

  • 尾插法建立单链表:
    ①、初始化单链表。
    ②、设置变量length记录链表长度
while循环{
	每次取一个数据元素e;
	ListInsert(L,length+1,e)插到尾部;
	length++;
}
  • 尾插法建立单链表
//在第i个位置插入元素e(带头结点)
bool ListInsert(LinkList &L, int i, ElemType e){
	if(i<1)
		return false;
	LNode *p;		//指针p指向当前扫描到的结点
	int j=0;		//当前p指向的是第几个结点
	p = L;			//L指向头结点,头结点是第0个结点(不存储数据)
	while(p != NULL && j <i-1){//循环找到第i-1个结点
		p = p->next;
		j++;
	}
	if(p == NULL)	//i值不合法
		return false;
	LNode *s = (LNode *)malloc(sizeof(LNode));
	s -> data = e;
	s -> next = p -> next;
	p -> next = s;	//将结点s连接到p之后
	return true;	//插入成功
}

在这里插入图片描述

  • 通过设置尾指针减少时间复杂度
    在这里插入图片描述
LinkList List_TailInsert(LinkList &L){//正向建立单链表
	int x;		//设ElemType为整型
	L = (LinkList)malloc(sizeof(LNode));//建立头结点
	LNode *s,*r = L;		//r为表尾指针
	scanf("%d",&x);			//输入结点的值
	while(x != 9999){
		s = (LNode *)malloc(sizeof(LNode));
		s -> data = x;
		r -> next = s;
		scanf("%d",&x);
	}
	r -> next = NULL;		//尾结点指针置空
	return L;
}

在这里插入图片描述
在这里插入图片描述

(二)头插法

  • 重要应用:链表的逆置
LinkList List_HeadInsert(LinkList &L){//逆向建立单链表
	LNode *s;
	int x;
	L = (LinkList)malloc(sizeof(LNode));//创建头结点
	L -> next = NULL;		//初始为空链表👈(必须)
	scanf("%d",&x);			//输入结点的值
	while(x != 9999){		//输入9999表示结束
		s = (LNode *)malloc(sizeof(LNode));//创建新结点
		s -> data = x;
		s -> next = L -> next;
		L -> next = s;		//将新结点插入表中,L为头指针
		scanf("%d",&x);
	}
	return L;	
}

以上是关于单链表的查找建立操作(C语言)的主要内容,如果未能解决你的问题,请参考以下文章

数据结构代码(用C语言) 单链表的插入和删除

(王道408考研数据结构)第二章线性表-第三节1:单链表的定义及其操作(插入和删除,建立之尾插和头插)

顺序表和链表的基本操作,用C语言实现!

单链表的基本操作操作,类C语言

考研数据结构之单链代码

考研数据结构之单链代码