一、线性表
线性表的定义:
线性表是具有相同数据类型的有限数据的序列。
线性表的特点:
出了第一个元素外,每个元素有且仅有一个直接前驱,除最后一个元素外有且只有一个后继。
线性表是一种逻辑结构,表示元素之间的一一的相邻关系,顺序表和链表是指存储结构,两者属于不同的概念。
线性表的顺序表示:
线性表的顺序存储即数组的动态、静态分配,特点是可以随机访问。
线性表的链式表示:
线性表的链式存储即单链表、双连表、循环单链表以及循环双连表,特点是随机插入,不可随机访问。
单链表的实现(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(' 删除111(第一个元素):') linklist1.deleteData(111) linklist1.readList() print(' 删除5(末尾的元素)') linklist1.deleteData(5) linklist1.readList() print(' 删除第一个元素:') linklist1.deleteElem(1) linklist1.readList() print(' 删除末尾的元素') 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()