有序列表
- 链表是以节点的方式来储存的;
- 每个节点包含data域,next域(指向下一个节点);
- 链表的各个节点不一定连续存储的;
- 分为带头节点的链表和没有头结点的链表
单链表(带头节点)逻辑结构示意图
//每一个HeroNode对象就是一个节点
public class HeroNode
{
public int no;
public string name;
public string nickname;
public HeroNode? next;//下一个节点
public HeroNode(int no, string name, string nickname)
{
this.no = no;
this.name = name;
this.nickname = nickname;
}
}
public class SingleLinkedList
{
//先初始化一个头结点,头结点不动,不放具体的数据
private HeroNode head = new HeroNode(0, "", "");
//添加节点到单向链表
//当不考虑编号顺序时,1:找到当前链表的最后节点,2:将最后的这个节点指向新的节点
// 按照编号顺序添加, 1:首先找到新添加的节点的位置,是通过复制变量,2:新的节点.next= temp.next ; 3: temp.next = 新的节点
public void Add(HeroNode heroNode)
{
//head不能动
HeroNode temp = head;
while (true)
{
if (temp.next == null) break;
temp = temp.next; //链表后移
}
temp.next = heroNode;
}
public void AddByOrder(HeroNode heroNode)
{
//因为是单链表,找的temp是添加位置的前一个节点,否则加不进去
HeroNode temp = head;
bool flag = false; //添加的编号是否存在
while (true)
{
if (temp.next == null) break;
if (temp.next.no > heroNode.no) break;
else if (temp.next.no == heroNode.no)
{
//编号存在
flag = true;
break;
}
temp = temp.next;
}
if (flag) Console.WriteLine("编号已存在,不能添加");
else { heroNode.next = temp.next; temp.next = heroNode; }
}
public void Update(HeroNode heroNode)
{
if (head.next == null) { Console.WriteLine("链表为空"); return; }
HeroNode temp = head;
bool flag = false; //编号是否存在
while (true)
{
if (temp.next == null) break;
if (temp.no > heroNode.no) { flag = true; break; };
temp = temp.next;
}
if (flag) { temp.name = heroNode.name; temp.nickname = heroNode.nickname; }
else Console.WriteLine("没有找到");
}
public void Del(HeroNode heroNode)
{
if (head.next == null) { Console.WriteLine("链表为空"); return; }
HeroNode temp = head;
bool flag = false; //编号是否存在
while (true)
{
if (temp.next == null) break;
if (temp.no == heroNode.no) { flag = true; break; };
temp = temp.next;
}
if (flag) { temp.next = temp.next.next; }
else Console.WriteLine("没有找到");
}
public void ShowList()
{
//
if (head.next == null) { Console.WriteLine("链表为空"); return; }
//因为头结点不能动,因此需要一个辅助变量来遍历
HeroNode temp = head.next;
while (true)
{
if (temp == null) break;
Console.WriteLine(string.Format("no={0},name={1},nickname={2}",temp.no,temp.name,temp.nickname));
temp = temp.next;
}
}
}