首页 > 其他分享 >[学习笔记]数据结构_线性表_顺序表and单链表

[学习笔记]数据结构_线性表_顺序表and单链表

时间:2023-06-05 11:44:47浏览次数:38  
标签:结点 单链 LNode int next LinkList 数据结构 线性表

线性表

线性表是一种逻辑结构,表示元素之间一对一的相邻关系。顺序表和链表是指存储结构,两者属于不同层面上的概念。

线性表的基本操作

bool InitList(&L)//初始化表,构造一个空的线性表

int Length(L)//求表长。返回线性表L的长度,即L中数据元素的个数

int LocateElem(L,e)//按值查找操作。在表L中查找具有给定关键字值的元素

ElemType GetElem(L,i)//按位查找操作,获取表L中第i个位置的元素的值

bool ListInsert(&L,i,e)//插入操作,在表L的第i个位置上插入指定元素e

bool ListDelete(&L,i,&e)//删除操作,删除表L中的第i个位置的元素,并用e返回删除元素的值

void PrintList(L)//输出操作,按前后顺序输出线性表L的所有元素值

bool Empty(L)//判空操作,若L为空表,则返回true,否则返回false

void DestroyList(&L)//销毁操作,销毁线性表,并释放线性表L所占用的内存空间

顺序表

顺序存储结构的优点:存储密度大,每个节点只存储数据元素。

顺序表最主要的特点是随机访问,即通过首地址和元素序号可在时间O(1)内找到指定的元素。

顺序表逻辑上相邻的元素物理上也相邻,所以插入和删除操作需要移动大量元素。

单链表

定义单链表结点类型

#include<stdio.h>
#define ElemType int

typedef struct LNode{//定义单链表节点类型
	ElemType data;
	struct LNode *next;	
}LNode,*LinkList;

通常用头指针来标识一个单链表,如单链表L。

头指针为NULL时表示一个空表。

此外为了操作上的方便,在单链表第一个结点之前附加一个结点,称为头结点。头结点的数据域可以不设任何信息,也可以记录表长等信息。

头结点的指针域指向线性表的第一个元素结点。

引入头结点带来的优点:①链表第一个位置上的操作和其他位置上的操作一致,无需进行特殊处理。②空表和非空表的处理得到了统一。

采用头插法和尾插法建立单链表

//建立单链表
LinkList List_HeadInsert(LinkList &L){//头插法建立单链表
	LinkList s;int x;//假设单链表的元素类型都是int好了,也别搞什么ElemType了
	L=(LinkList)malloc(sizeof(LNode));//先把头结点安排上
	L->next=NULL;//不要忘记这一步,否则单链表建成后发现尾结点不是NULL
	scanf("%d",&x);
	while(x!=9999){//输入9999就是结束
		s=(LNode*)malloc(sizeof(LNode));//创建新结点
		s->data=x;
		s->next=L->next;//注意看这一步,所以才是头插嘛
		L->next=s;
		scanf("%d",&x);
	}
	return L;
}

LinkList List_TailInsert(LinkList &L){//尾插法建立单链表
	LinkList s;int x;
	L=(LinkList)malloc(sizeof(LNode));//别忘了先把头结点的空间开辟好!
	LNode *t;//t为表尾指针
	t=L;
	scanf("%d",&x);
	while(x!=9999){
		s=(LNode*)malloc(sizeof(LNode));
		s->data=x;
		t->next=s;
		t=s;
		scanf("%d",&x);
	}
	t->next=NULL;//插入结束后,安排一下尾结点的指针为NULL
	return L;
}

输出测试一下

//输出单链表,测试用的
void PrintList(LinkList L){
	LNode *s;
	s=L->next;
	printf("开始输出:\n");
	while(s!=NULL){
		printf("%d ",s->data);
		s=s->next;
	}
	printf("\n**输出结束**\n");
}

 两个查找:按值查找和按序号查找结点

//按序号查找节点
LNode *GetElem(LinkList L,int i){
	if(i<1){return NULL;}//输入不合法,直接返回NULL得了
	LNode *s=L->next;//创建一个临时指针,指向第一个元素
	int j=1;
	while(j!=i){
		s=s->next;
		j++;
	}
	return s;//直接把整个LNode结点作为结果返回了
}
//按值查找表节点
LNode *LocateElem(LinkList L,ElemType e){
	LNode *s=L->next;
	while(s->data!=e&&s!=NULL){
		s=s->next;
	}
	return s;//直接把整个LNode结点作为结果返回了
}

两个操作:插入结点操作和删除结点操作

//插入节点操作
bool ListInsert(LinkList &L,int i,ElemType e){
	
	if(i==1){
		LNode *newnode=(LNode*)malloc(sizeof(LNode));
		newnode->data=e;
		newnode->next=L->next;
		L->next=newnode;
		return true;
	}//之所以专门搞个i==1的情况还是受限于GetElem不能把头结点给弄出来
	
	LNode *s=GetElem(L,i-1);//用上边的GetElem先获取第i-1个结点******这一步要注意,可以利用已有的函数
	if(s==NULL)return false;
	
	LNode *newnode=(LNode*)malloc(sizeof(LNode));//创建一个新结点并开辟空间
	newnode->data=e;
	newnode->next=s->next;
	s->next=newnode;
	return true;
}
//删除节点操作
bool ListDelete(LinkList &L,int i){
	if(i==1){
		LNode *s=L->next;
		L->next=L->next->next;
		free(s);
		return true;
	}
	LNode *s=GetElem(L,i-1);
	if(s==NULL)return false;
	LNode *temp=s->next;
	s->next=s->next->next;
	free(temp);
	return true;
}
//求表长操作
int Length(LinkList L){
	LNode *s=L->next;
	int i=0;
	while(s!=NULL){
		s=s->next;
		i++;
	}
	return i;
}

 

标签:结点,单链,LNode,int,next,LinkList,数据结构,线性表
From: https://www.cnblogs.com/soaring27221/p/17457391.html

相关文章

  • R数据结构-列表
    列表(List)是一种数据结构,它可以包含不同类型的对象,包括向量、矩阵、数据框、函数等。列表允许您将多个对象组合到一个结构中,以便以统一的方式进行处理和访问#创建一个包含向量、矩阵和数据框的列表vec<-c(1,2,3)mat<-matrix(1:9,nrow=3)df<-data.frame(x=c(1,2......
  • 《数据结构》之栈和堆结构及JVM简析
    导言:在数据结构中,我们第一了解到了栈或堆栈,它的结构特点是什么呢?先进后出,它的特点有什么用呢?我们在哪里可以使用到栈结构,栈结构那么简单,使用这么久了为什么不用其它结构替代?一.程序在内存中的分布作为一个程序猿,我们应该会常常跟代码打交道,那么我们所编写的程序或代码,是怎么跑......
  • C/C++数据结构设计题[2023-06-04]
    C/C++数据结构设计题[2023-06-04]停车场模拟管理程序的设计与实现1.设计目的理解线性表的逻辑结构和存储结构,进一步提高使用理论知识指导解决实际问题的能力。2.问题描述设停车场只有一个可停放几辆汽车的狭长通道,只有一个大门可供汽车进出。汽车在停车场内按车辆到达的先后顺......
  • 数据结构(I)
    1链表1.1单链表模板:AcWing826.单链表题目:实现一个单链表,实现以下\(3\)种操作:Hx向链表头插入一个数\(x\);Dx删除第\(x\)个插入的数(若\(x=0\),表示删除头结点);Ikx在第\(k\)个插入的数后插入一个数\(x\)(保证\(k>0\))。给你\(m\)次操作,输出最终链表。\(1......
  • 数据结构与算法-技巧类型题总结
    目录排序逆序排序逆序查询后矩阵的和......
  • 初级数据结构--栈、队列
    栈后端(进栈)插入,后端(出栈)删除顺序存储,用静态数组实现,需要记录栈顶指针,栈的增删操作只能操作栈顶的护数据。两种初始化方式top=-1top=0共享栈两个栈共用一片内存空间,两个栈从两边向中间增长初始化1个栈顶指针初始为-1;另一个栈顶指针初始为Maxsize栈满条件 top0+1==top1队列后端(......
  • 数据结构与算法分析课程设计
    1.设计目的数据结构课程设计是学习了数据结构课程后的一个综合性实践教学环节,是对课程理论和课程实验的综合和补充。它主要培养学生综合运用已学过的理论和技能去分析和解决实际问题的能力,对加深课程理论的理解和应用、切实加强学生的实践动手能力和创新能力具有重要意义。2.设计要......
  • 初级数据结构--双链表、循环链表
    双链表结构体内含有两个指针域。相比单链表,双链表每个节点多了一个存储前一节点的指针。对节点的增加、删除操作比单链表便捷,不用独立指针记录前一节点voidInitDNodeList(DNode**D){ *D=(DNode*)malloc(sizeof(DNode)); if(!*D) return; (*D)->front=NULL; (*D)->nex......
  • lucene底层数据结构——FST,针对field使用列存储,delta encode压缩doc ids数组,LZ4压缩算
    参考:http://www.slideshare.net/lucenerevolution/what-is-inaluceneagrandfinalhttp://www.slideshare.net/jpountz/how-does-lucene-store-your-data摘录一些重要的:看一下Lucene的倒排索引是怎么构成的。我们来看一个实际的例子,假设有如下的数据: docid年龄性别118女220女318男 ......
  • lucene底层数据结构——底层filter bitset原理,时间序列数据压缩将同一时间数据压缩为
    如何联合索引查询?所以给定查询过滤条件age=18的过程就是先从termindex找到18在termdictionary的大概位置,然后再从termdictionary里精确地找到18这个term,然后得到一个postinglist或者一个指向postinglist位置的指针。然后再查询gender=女的过程也是类似的。最后得出age=18......