单向链表中插入新节点

在单向链表中插入新节点有三种情况:
1.加到第一个节点之前
2.加到最后一个节点之后
3.加到链表中间任一位置

先说1,新节点插入第一个节点之前,成为此链表的首节点:只需把新节点的指针指向链表原来的第一个节点,再把链表头指针指向新节点即可。
python的算法如下:

newnode.next=first
first=newnode

第二种情况,新节点插入最后一个节点之后:只需把链表最后一个节点的指针指向新节点,新节点的指针指向None即可。
python算法如下:

ptr.next=newnode
newnode.next=None

第三种情况,将新节点插入链表中间的位置,例如插在节点X和Y之间,只要将X节点的指针指向新节点,新节点的指针指向Y节点即可。
python算法如下:

newnode.next=x.next
x.next=newnode

下面是一个范例
设计一个python程序,建立一个员工数据的单向链表,并且允许在链表头部、尾部和中间插入新节点,最后离开时,列出此链表的最后所有节点的数据字段的内容。结构成员类型如下:

class employe:
	def __init__(self):
		self.num=0
		self.salary=0
		self.name=''
		self.next=None

范例程序如下:

import sys
class employee:
    def __init__(self):
        self.num=0
        self.salary=0
        self.name=''
        self.next=None

def findnode(head,num):
    ptr=head
    while ptr != None:
        if ptr.num==num:
            return ptr
        ptr=ptr.next
    return ptr

def insertnode(head,ptr,num,salary,name):
    InsertNode=employee()
    if not InsertNode:
        return None
    InsertNode.num=num
    InsertNode.salary=salary
    InsertNode.name=name
    InsertNode.next=None
    if ptr==None:    #插入第一个节点
        InsertNode.next=head
        return InsertNode
    else:
        if ptr.next==None: #插入最后一个节点
            ptr.next=InsertNode
        else: #插入中间节点
            InsertNode.next=ptr.next
            ptr.next=InsertNode
    return head

position=0
data=[[1001,32367],[1002,24388],[1003,27556],[1007,31299],\
      [1012,42660],[1014,25676],[1018,44145],[1043,52182],\
    [1031,32769],[1037,21100],[1041,32196],[1046,25776]]
namedata=['Allen','Scott','Marry','John','mark','ricky','lisa','jasica','hanson',\
          'amy','bob','jack']
print('员工编号 薪水 员工编号 薪水 员工编号 薪水 员工编号 薪水')
print('-------------------------------------------------')
for i in range(3):
	for j in range(4):
		print('[%4d] $%5d ' %(data[j*3+i][0],data[j*3+i][1]),end=' ')
	print()
print('-------------------------------------------------')
head=employee() #建立链表的头部
head.next=None

if not head:
	print('Error!!内存分配失败\n')
	sys.exit(1)

head.num=data[0][0]
head.name=namedata[0]
head.salary=data[0][1]
head.next=None
ptr=head
for i in range(1,12): #建立链表
	newnode=employee()
	newnode.next=None
	newnode.num=data[i][0]
	newnode.name=namedata[i]
	newnode.salary=data[i][1]
	newnode.next=None
	ptr.next=newnode
	ptr=ptr.next

while(True):
    print('请输入要插入其后的员工编号,如输入编号不在此链表中,')
    position=int(input('新输入的员工节点将视为此链表的头部,结束插入请输入-1:'))
    if position == -1:
        break
    else:
        ptr=findnode(head,position)
        new_num=int(input('请输入新插入的员工编号:'))
        new_salary=int(input('请输入新插入的员工薪水:'))
        new_name=input('请输入新插入的员工姓名:')
        head=insertnode(head,ptr,new_num,new_salary,new_name)
    print()
ptr=head
print('\t员工编号	姓名\t薪水')
print('\t====================')
while ptr !=None:
    print('\t[%2d]\t[ %-7s]\t[%3d]' %(ptr.num,ptr.name,ptr.salary))
    ptr=ptr.next
		
	

运行结果如下:
在这里插入图片描述

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值