首页 > 其他分享 >第二章 线性表-单链表

第二章 线性表-单链表

时间:2023-09-19 17:22:46浏览次数:38  
标签:结点 单链 线性表 LNode next LinkList 第二章 指针

线性表

2.5.1 单链表的定义和表示

存储结构(物理位置)可以不连续。(非顺序映像/链式映像)

typedef struct LNode {
	ElemType data; // 数据域
	struct LNode *next; // 指针域
} LNode, *LinkList; // (同一结构体指针类型起了两个名称)
// LinkList是指向结构体LNode的指针类型
// 如果定义LinkList L 则L就是单链表的头指针
// 如果定义LNode *p 则p就是指向单链表中某个结点的指针

每个结点的指针域指向其直接后继结点。

单链表由表头指针唯一确定,所以可以用表头指针的名字为单链表命名。

头结点(不作为表长计入 头结点的指针域指向首元结点
首元结点 链表中存储第一个元素的结点
头指针 指向链表中第一个结点的指针

加入头结点的好处:

  1. 首元结点可以和其他结点同样处理。

  2. 判定空表:L == NULL

头指针始终是指向头结点的非空指针。

单链表是顺序存取 意思是只能从头开始遍历

2.5.2 单链表基本操作的实现

  1. 初始化

    Status IntList(LinkList &L) {
    	L = new LNode;
        L -> next = NULL; // 头结点指针域置空
        return OK;
    }
    
  2. 取值

    只能从头到尾遍历。

    平均时间复杂度为O(n).

    Status GetElem(LinkList L, int i, ElemType &e) {
    	p = L-> next; 
    	j = 1; // 计数器
    	while(p && j < i) {
    		p = p -> next;
    		++j;
    	}
    	if(!p || j > i) return ERROR;
    	e = p -> data;
    	return OK;
    }
    
  3. 查找

    从头到尾查找。

    平均时间复杂度为O(n).

  4. 插入

    Status ListInsert(LinkList &L, int i, ElemType e) {
    	// 在带头结点的链表L中第i个位置插入值为e的结点
    	p = L;
    	j = 0;
    	while(p && j < i - 1) {
    		p = p -> next;
    		++j;
    	}
    	if(!p || j > i - 1) return ERROR;
    	s = new LNode;
    	s -> data = e;
    	s -> next = p -> next;
    	p -> next = s;
    	return OK;
    }
    

    注意指针域赋值的顺序。

    要插入到第i个位置,要找到第i - 1个位置。

    时间复杂度是O(n),因为要先遍历找到插入位置

  5. 删除

    和插入一样,需要先找到待删除元素的前驱结点。

    然后修改指针域,并释放待删结点的空间。

    Status ListDelete(LinkList &L, int i) {
    	p = L;
    	j = 0;
    	while(p -> next && j < i - 1) {
    		p = p -> next;
    		++j;
    	}
    	if(!p || j > i - 1) return ERROR;
    	q = p -> next; // 储存被删结点地址 以备释放
    	p -> next = q -> next;
    	delete q;
    	return OK;
    }
    

    时间复杂度是O(n)。

  6. 创建

    (1) 前插法

    ​ 每次生成的新结点插入头结点之后(也就是作为新的首元结点)。

    void CreateList_H(LinkList &L, int n) {
    	L = new LNode;
    	L -> next = NULL;
    	for(int i = 0; i < n; i++) {
    		 p = new LNode;
    		 cin >> p -> data;
    		 p -> next = L -> next;
    		 L -> next = p; // 注意顺序
    	}
    }
    

    ​ 时间复杂度是O(n)。

    (2) 后插法

    ​ 为了便于每次将新结点插入表尾, 需要一个尾指针指向尾结点。

    void CreateList_R(LinkList &L, int n) {
    	L = new LNode;
    	L -> next = NULL;
    	r = L;
    	for(int i = 0; i < n; i++) {
    		p = new LNode;
    		cin >> p -> data;
    		p -> next = NULL;
    		r -> next = p;
    		r = p;
    	}
    }
    

    ​ 时间复杂度是O(n)。

标签:结点,单链,线性表,LNode,next,LinkList,第二章,指针
From: https://www.cnblogs.com/iszxh/p/17715171.html

相关文章

  • 线性表之单链表(上)
    单链表就是一个表结构最后存储的位置是下一个表结构的地址,一般通过p->next表示存储的下一个位置的地址//link_list.htypedefintdata_t;typedefstructnode{data_tdata;structnode*next;}listnode,*linklist;linklistlist_create();intlist_tail_inser......
  • 第二章 线性表
    线性表2.5.3循环链表最后一个结点的指针域指向头结点终止条件:p!=L&&p->next!=L循环链表的合并:设立尾指针。将第一个表的尾指针指向第二个表的第一个结点,第二个表的尾指针指向第一个表的头结点,然后释放第二个表的头结点。时间复杂度是O(1)2.5.4双向链表克服了单链表......
  • 王道数据结构:设线性表中每个元素有两个数据项k1和k2,现对线性表按一下规则进行排序:先
    题目:设线性表中每个元素有两个数据项k1和k2,现对线性表按一下规则进行排序:先看数据项k1,k1值小的元素在前,大的在后;在k1值相同的情况下,再看k2,k2值小的在前,大的在后。满足这种要求的排序方法是()A.先按k1进行直接插入排序,再按k2进行简单选择排序B.先按k2进行直接插入排序,再按k1进行简......
  • 9.15单链表无哨兵java实现
    publicclassMain{publicstaticvoidmain(String[]args){LNodeL=newLNode();System.out.println(L.number());L.Isempty();L.addFirst(4);//头插L.addFirst(3);L.addFirst(2);L.addFirst(1);L.a......
  • JS深入学习笔记 - 第二章.类和对象
    3.类和对象3.1面向对象这里顺带提一句学习JAVA时,老师说的面向对象和面向过程的区别:面向过程:强调做什么事情,具体什么步骤。举个把大象放进冰箱的例子:打开冰箱门把大象放进冰箱关上冰箱门面向对象:强调的是做动作的主体(称之为对象)冰箱:打开操作冰箱:放的操作(放的可以是大象......
  • 第二章注重实效的途径
     ......
  • MySQL篇:第二章_初识MySQL
    初始MySQLMySQL的背景1、前身属于瑞典的一家公司,MySQLAB2、08年被sun公司收购3、09年sun被oracle收购MySQL的优点1、开源、免费、成本低2、性能高、移植性也好3、体积小,便于安装数据库的好处​ 1、持久化数据到本地​ 2、可以实现结构化查询,方便管理​数据库相关概......
  • 例2.7 算法实现带头结点单链表的就地逆置问题。
    1.题目例2.7算法实现带头结点单链表的就地逆置问题。2.算法思想3.代码//就地逆置voidReverseList(LinkListL){Node*p,*q;p=L->next;L->next=NULL;while(p){q=p->next;p->next=L->next;L->next=p;......
  • 线性表——链式存储
    单链表(有头结点)#include<stdlib.h>//定义typedefstructLNode{intdata;//数据域structLNode*next;//指针域指向下一个结点,所以是structLNode类型}LNode,*LinkList;//*LinkList用于表示这是一个指向structLNode类型的指针//初始......
  • ESP32(含ESP8266)实战问题第二章总结
    1. 一定要确保连接在同一个网络中,才可以通讯这是基础,两种方式都是需要这个基础的。如在esp8266作为服务端的时候可以先连接手机的热点之后,在调试软件中进行连接后数据传输。2. Serial.println()不会帮你修饰就发出去了,所以造成了你在写esp8266作为服务器的时候,服务端传输的数据用这......