数组(顺序存储结构)
链表
一个结点由存放数据元素的数据域和存放后继结点地址的指针域组成。
头结点的数据域可以不存放任何信息,其指针域存储指向第一个结点的指针。
链表的一个结点p,其储存的数据为p->data.
链表的创建、插入、删除
插入:
s = p->next
s->next = p->next
删除:
p->next = p->next->next
创建:不需要预先分配大小和位置
上面为头插法,也可以用尾插法创建
整表删除:
不能直接free(p),因为释放的只有头结点,后面的结点都没有被释放。
循环链表:(与单链表的差异在于,单链表判断p->next是否为空,循环链表判断是否为头结点)
双向链表:(加一个指向上一节点的指针)
插入:(注意顺序)
s->prior = p
s->next = p->next
p->next->prior = s
p->next = s
删除:
p->prior->next = p->next
p->next->prior = p->prior
free(p)
附python代码:
#/usr/bin/python
#-*- coding: utf-8 -*-
#Function: simulate the link-list in python
#__author__: Tresser
#
class LNode(object):
#结点初始化函数, p 即模拟所存放的下一个结点的地址
#为了方便传参, 设置 p 的默认值为 0
def __init__(self, data, p=0):
self.data = data
self.next = p
class LinkList(object):
def __init__(self):
self.head = None
#链表初始化函数, 方法类似于尾插
def initList(self, data):
#创建头结点
self.head = LNode(data[0])
p = self.head
#逐个为 data 内的数据创建结点, 建立链表
for i in data[1:]:
node = LNode(i)
p.next = node
p = p.next
#链表判空
def isEmpty(self):
if self.head.next == 0:
print "Empty List!"
return 1
else:
return 0
#取链表长度
def getLength(self):
if self.isEmpty():
exit(0)
p = self.head
len = 0
while p:
len += 1
p = p.next
return len
#遍历链表
def traveList(self):
if self.isEmpty():
exit(0)
print '\rlink list traving result: ',
p = self.head
while p:
print p.data,
p = p.next
#链表插入数据函数
def insertElem(self, key, index):
if self.isEmpty():
exit(0)
if index<0 or index>self.getLength()-1:
print "\rKey Error! Program Exit."
exit(0)
p = self.head
i = 0
while i<=index:
pre = p
p = p.next
i += 1
#遍历找到索引值为 index 的结点后, 在其后面插入结点
node = LNode(key)
pre.next = node
node.next = p
#链表删除数据函数
def deleteElem(self, index):
if self.isEmpty():
exit(0)
if index<0 or index>self.getLength()-1:
print "\rValue Error! Program Exit."
exit(0)
i = 0
p = self.head
#遍历找到索引值为 index 的结点
while p.next:
pre = p
p = p.next
i += 1
if i==index:
pre.next = p.next
p = None
return 1
#p的下一个结点为空说明到了最后一个结点, 删除之即可
pre.next = None
#初始化链表与数据
data = [1,2,3,4,5]
l = LinkList()
l.initList(data)
l.traveList()
#插入结点到索引值为3之后, 值为666
l.insertElem(666, 3)
l.traveList()
#删除索引值为4的结点
l.deleteElem(4)
l.traveList()
代码摘自:https://blog.csdn.net/Blood_Seeker/article/details/78992722
内容整理自:《大话数据结构》