线性表 (单链表、循环链表-python实现)
一、线性表
线性表的定义:
线性表是具有相同数据类型的有限数据的序列。
线性表的特点:
出了第一个元素外,每个元素有且仅有一个直接前驱,除最后一个元素外有且只有一个后继。
线性表是一种逻辑结构,表示元素之间的一一的相邻关系,顺序表和链表是指存储结构,两者属于不同的概念。
线性表的顺序表示:
线性表的顺序存储即数组的动态、静态分配,特点是可以随机访问。
线性表的链式表示:
线性表的链式存储即单链表、双连表、循环单链表以及循环双连表,特点是随机插入,不可随机访问。
单链表的实现(python):
#定义每个节点
class Node:
def __init__(self,data):
self.data=data
self.next=None class linkList:
#初始化头结点
def __init__(self,n):
self.head=Node(None)
self.n=n
#头插法建立链表
def listCreateForward(self):
if self.n==0:
return False
else:
temp=self.head
for i in range(1,self.n+1):
print('请输入第{0}个节点:'.format(i))
num = input()
node = Node(num)
node.next=temp.next
temp.next = node
#尾插法建立链表
def listCreateBackward(self):
if self.n==0:
return False
else:
temp=self.head
for i in range(1,self.n+1):
print('请输入第{0}个节点:'.format(i))
num = input()
node = Node(num)
temp.next=node
temp=node
#读取链表
def readList(self):
if self.n==0:
print("空链表!")
else:
temp = self.head
while temp.next!=None:
temp = temp.next
print(temp.data,end=' ')
#链表长度
def Length(self):
i=0
temp=self.head
while temp.next!=None:
temp=temp.next
i+=1
return i
#按值查找
def locateElem(self,num):
i = 0
temp = self.head
while temp.next != None:
temp = temp.next
i += 1
if int(temp.data)==num:
return i
return None
#按位置查找
def getElem(self,j):
i = 0
temp = self.head
while temp.next != None:
temp = temp.next
i += 1
if int(j)==i:
return temp.data
return None
#按位置插入数字
def listInsert(self,j,num):
if int(j)<0:
return None
elif self.Length()<j:
return None
else:
i = 0
temp = self.head
while temp.next != None:
i += 1
if int(j) == i:
node=Node(num)
node.next=temp.next
temp.next=node
temp = temp.next
#删除特定元素
def deleteData(self,num):
temp=self.head
while True:
if temp.next==None:
break
#当这个节点是尾节点时
if int(temp.next.data)==num and temp.next.next==None:
temp.next=None
break
elif int(temp.next.data)==num:
temp.next=temp.next.next
temp=temp.next
#删除特定位置的元素
def deleteElem(self,j):
if j==1:
self.head.next=self.head.next.next
elif j==self.Length() :
temp=self.head.next
while True:
if temp.next.next==None:
temp.next=None
break
temp=temp.next
elif j<self.Length():
i=2
temp=self.head.next
while True:
if i==j:
temp.next=temp.next.next
else:
print('erro!!!!')
return None linklist1=linkList(5)
linklist1.listCreateBackward()
linklist1.readList()
length=linklist1.Length()
print('length={0}'.format(length))
locate=linklist1.locateElem(5)
print('5在位置{0}'.format(locate))
data=linklist1.getElem(3)
print('第3个位置是{0}'.format(data))
linklist1.listInsert(1,111)
linklist1.readList()
print('\n删除111(第一个元素):')
linklist1.deleteData(111)
linklist1.readList()
print('\n删除5(末尾的元素)')
linklist1.deleteData(5)
linklist1.readList()
print('\n删除第一个元素:')
linklist1.deleteElem(1)
linklist1.readList()
print('\n删除末尾的元素')
linklist1.deleteElem(3)
linklist1.readList() 结果:
请输入第1个节点:
1
请输入第2个节点:
2
请输入第3个节点:
3
请输入第4个节点:
4
请输入第5个节点:
5
1 2 3 4 5 length=5
5在位置5
第3个位置是3
111 1 2 3 4 5
删除111(第一个元素):
1 2 3 4 5
删除5(末尾的元素)
1 2 3 4
删除第一个元素:
2 3 4
删除末尾的元素
2 3
循环链表的实现(python):其它部分与单链表相似
#定义节点
class Node:
def __init__(self,data):
self.data=data
self.next=None class circleList:
# 初始化头结点
def __init__(self,n):
self.head=Node(None)
self.head.next=self.head
self.n = n # 头插法建立链表-
def listCreateForward(self):
if self.n==0:
return False
else:
temp=self.head
for i in range(1,self.n+1):
print('请输入第{0}个节点:'.format(i))
num = input()
node = Node(num)
node.next=temp.next
temp.next = node
temp=temp.next
# 尾插法建立链表
def listCreateBackward(self):
if self.n==0:
return False
else:
temp=self.head
for i in range(1,self.n+1):
print('请输入第{0}个节点:'.format(i))
num = input()
node = Node(num)
temp.next=node
temp=node
temp.next = self.head
#读取循环链表
def readList(self):
if self.n==0:
print("空链表!")
else:
temp = self.head
while temp.next!=self.head:
temp = temp.next
print(temp.data,end=' ') linklist1=circleList(5)
linklist1.listCreateForward()
linklist1.readList()
linklist1=circleList(5)
linklist1.listCreateBackward()
linklist1.readList()
线性表 (单链表、循环链表-python实现)的更多相关文章
- Python线性表——单链表
1. 线性表简介 线性表是一种线性结构,它是由零个或多个数据元素构成的有限序列.线性表的特征是在一个序列中,除了头尾元素,每个元素都有且只有一个直接前驱,有且只有一个直接后继,而序列头元素没有直接前驱 ...
- JAVA实现具有迭代器的线性表(单链表)
一,迭代器的基本知识: 1,为什么要用迭代器?(迭代:即对每一个元素进行一次“问候”) 比如说,我们定义了一个ADT(抽象数据类型),作为ADT的一种实现,如单链表.而单链表的基本操作中,大部分需要用 ...
- 数据结构之 线性表---单链表的操作B(先逆序+再删除重复元素)
数据结构上机测试2-2:单链表操作B Time Limit: 1000MS Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删 ...
- 数据结构之 线性表---单链表操作A (删除链表中的指定元素)
数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据 ...
- C数据结构 : 线性表 与 链表
一.线性表 一般表现为数组,使用一组地址连续的存储单元依次存储数据元素,如图: 它具有如下特点: 长度固定,必须在分配内存之前确定数组的长度. 存储空间连续,即允许元素的随机访问. 存储密度大,内存中 ...
- c/c++ 线性表之双向循环链表
c/c++ 线性表之双向循环链表 线性表之双向循环链表 不是存放在连续的内存空间,链表中的每个节点的next都指向下一个节点,每个节点的before都指向前一个节点,最后一个节点的下一个节点不是NUL ...
- c/c++ 线性表之单向循环链表
c/c++ 线性表之单向循环链表 线性表之单向循环链表 不是存放在连续的内存空间,链表中的每个节点的next都指向下一个节点,最后一个节点的下一个节点不是NULL,而是头节点.因为头尾相连,所以叫单向 ...
- C语言 严蔚敏数据结构 线性表之链表实现
博主最近在考成都大学皇家计算机科学与技术专业,复习专业课数据结构,正好学习到线性结构中的线性表用链表这种存储结构来实现. 首先,数据结构包括1.数据的操作2.逻辑结构3.存储结构(数据结构三要素. 直 ...
- 单链表的python实现
首先说下线性表,线性表是一种最基本,最简单的数据结构,通俗点讲就是一维的存储数据的结构. 线性表分为顺序表和链接表: 顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,称为线性表的顺序存 ...
- Python与数据结构[0] -> 链表/LinkedList[0] -> 单链表与带表头单链表的 Python 实现
单链表 / Linked List 目录 单链表 带表头单链表 链表是一种基本的线性数据结构,在C语言中,这种数据结构通过指针实现,由于存储空间不要求连续性,因此插入和删除操作将变得十分快速.下面将利 ...
随机推荐
- HDU 2719 The Seven Percent Solution (水题。。。)
题意:把字符串中的一些特殊符号用给定的字符串代替. 析:没的说. 代码如下: #include <iostream> #include <cstdio> #include &l ...
- IntelliJ IDEA 14 Keygen
package keygen; import java.math.BigInteger; import java.util.Date; import java.util.zip.CRC32; publ ...
- (最小生成树) Jungle Roads -- POJ -- 1251
链接: http://poj.org/problem?id=1251 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2177 ...
- Andfix热修复原理
一.前言 最近腾讯弄出一个Tinker热修复框架,那么本文先不介绍这个框架,先来介绍一下阿里的一个热修复框架AndFix,这个框架出来已经很长时间了,但是看网上没有太多非常详细的讲解,这里就来做一次分 ...
- CGA裁剪算法之线段裁剪算法
CGA裁剪算法之线段裁剪算法 常用的线段裁剪算法有三种:[1]Cohen_SutherLand裁剪算法,[2]中点分割裁剪算法,[3]参数化方法. 1. Cohen_SutherLand裁剪算法 为了 ...
- git提交提示workspace.xml出现conflicted
问题:在github上管理项目,多次提交以后提交提示workspace.xml出现conflicted原因:Android项目在根目录的.gitignore文件中没有添加.idea文件夹忽略. 解决办 ...
- java web开发过程中的“\”指的是什么,如何区分
- PHP环境的搭建及与nginx的集成
1. 去php官网下载最新稳定版(最新其实是7.0,为了兼容性,使用5.6.16) wget http://cn2.php.net/get/php-5.6.16.tar.gz/from/this/m ...
- C# 如何防止重放攻击(转载)
转载地址:http://www.cnblogs.com/similar/p/6776921.html 重放攻击 重放攻击是指黑客通过抓包的方式,得到客户端的请求数据及请求连接,重复的向服务器发送请求的 ...
- Microsoft SQL Server 2012 管理 (2): 实例与数据库管理
1.加密数据库 /* Module 2 Implementing Transparent Data Encryption */ -- 2.1 Create DataBase Master Key US ...