1.顺序表和链表不同
顺序表:
由系统提前分配一组连续的存储空间;
采用顺序存储的方式存储数据元素;
元素逻辑顺序与物理位置直接相关,可随机存取;
链表:
由存储结点创建时主动向系统申请存储空间;
结点之间通过指针链接;
元素逻辑顺序由指针链接顺序决定,与物理位置无关,仅能顺序存取;
2.链表解决的问题
在实际情况中,尤其在多任务操作系统里,某时刻会同时运行多个进程,这些进程会向系统申请大小不同的存储空间,运行一段时间后会导致内存空间的碎片化。此时,向系统申请一片连续的存储空间极为困难,而申请一片不连续的存储空间则相对容易,链表可以很好的利用不连续的存储空间对数据元素进行存储。
3.链表结构
链表 = 通过指针链接的结点
结点 = 数据域 + 指针域
数据域-------->存储数据元素
指针域-------->存储下一结点地址
具体结构参考图2-10和图2-11
4.链表分类
链 表 = { 单 项 链 表 双 向 链 表 循 环 链 表 链表=\left\{ \begin{aligned} 单项链表 \\ 双向链表 \\ 循环链表 \end{aligned} \right. 链表=⎩⎪⎨⎪⎧单项链表双向链表循环链表
单项链表:结点只包括1个指针域,指向直接后继结点,最后一个结点指针域为None
双向链表:结点包括2个指针域,一个指向先驱结点,一个指向后继结点,最后一个结
点指针域为None
循环链表:从任一结点出发,都可以知道表中其他结点
单向循环链表:单项链表,表中最后一个指针域指向第一个结点
双向循环列表:双向链表,表中最后一个指针域指向第一个结点
5.单链表的实现
1.初始化结点函数的实现
#初始化结点函数
class Node():
def __init__(self,data):
self.data=data #创建数据域并初始化为data
self.next=None #next为系统函数,创建数据域并初始化为空
2.初始化头结点并创建单链表函数
#初始化头结点函数
class SingleLinkedList():
def __init__(self):
self.head = Node(None)
#创建单链表
def CreatSingleLinkedList(self):
print("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^")
print("请输入数据后按回车键结束,若想结束按#")
print("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^")
cNode=self.head
Element=input("请输入当前结点的值:")
while Element !="#":
nNode = Node(int(Element))
cNode.next = nNode
cNode = cNode.next
#nNode,cNode.next和cNode的值一样,均是结点的地址
Element=input("请输入当前结点的值:")
#尾端插入元素函数
def InserElementInTail(self):
Element=input("请输入待插入结点的值:")
if Element =="#":
return
cNode=self.head
nNode=Node(int(Element))
while cNode.next!=None:
cNode=cNode.next
cNode.next=nNode
#首端插入元素函数
def InserElementInHead(self):
Element=input("请输入待插入结点的值:")
if Element=="#":
return
cNode=self.head
nNod