C语言中采用指针的方式操控链表,而matlab中没有指针的概念,处理某些算法时略有不便,于是在网上查询别人的代码,经过总结也可以实现。实现的过程中采用了面向对象的编程概念,类似于C++中的class操作,这是之前没有接触到的知识。matlab定义类使用关键字classdef,详细使用方法可以参考help帮助文档。
1.建立链表首先建立节点类node,以下代码来至互联网。
classdef node < handle
% node A class to represent a doubly-linked list node.
% Multiple node objects may be linked together to create linked lists.
% Each node contains a piece of data and provides access to the next
% and previous nodes.
properties
Data
end
properties(Access=public)
Next
Prev
end
methods
function node = node(Data)
% node Constructs a node object.
if nargin > 0
node.Data = Data;
end
end
function insertAfter(newNode, nodeBefore)
% insertAfter Inserts newNode after nodeBefore.
disconnect(newNode);
newNode.Next = nodeBefore.Next;
newNode.Prev = nodeBefore;
if ~isempty(nodeBefore.Next)
nodeBefore.Next.Prev = newNode;
end
nodeBefore.Next = newNode;
end
function insertBefore(newNode, nodeAfter)
% insertBefore Inserts newNode before nodeAfter.
disconnect(newNode);
newNode.Next = nodeAfter;
newNode.Prev = nodeAfter.Prev;
if ~isempty(nodeAfter.Prev)
nodeAfter.Prev.Next = newNode;
end
nodeAfter.Prev = newNode;
end
function disconnect(node)
% DISCONNECT Removes a node from a linked list.
% The node can be reconnected or moved to a different list.
if ~isscalar(node)
error('Nodes must be scalar')
end
prevNode = node.Prev;
nextNode = node.Next;
if ~isempty(prevNode)
prevNode.Next = nextNode;
end
if ~isempty(nextNode)
nextNode.Prev = prevNode;
end
node.Next = [];
node.Prev = [];
end
function delete(node)
% DELETE Deletes a node from a linked list.
disconnect(node);
end
function disp(node)
% DISP Display a link node.
if (isscalar(node))
disp('Doubly-linked list node with data:')
disp(node.Data)
else % If node is an object array, display dims only
dims = size(node);
ndims = length(dims);
for k = ndims-1:-1:1
dimcell{k} = [num2str(dims(k)) 'x'];
end
dimstr = [dimcell{:} num2str(dims(ndims))];
disp([dimstr ' array of doubly-linked list nodes']);
end
end
end % methods
end % classdef
2.建立链表类list,如下可以实现链表的插入,遍历,查找最小值等。
classdef list <handle
%链表有三个属性,一个是链表的头元素,一个是尾元素,另一个是链表的长度
properties (GetAccess = public , SetAccess = public )
head
tail
size
end
methods
%创建一个空的链表
function list = list()
list.size=0;
end
%在链表的尾部添加一个元素
function insertaftertail(list,node)
if isempty(list.head)
list.head=node;
list.tail=node;
else
node.Prev=list.tail;
list.tail.Next=node;
list.tail=node;
end
list.size=list.size+1;
end
%在链表的头部添加一个元素
function insertbeforehead(list,node)
if isempty(list.head)
list.head=node;
list.tail=node;
else
node.Next=list.head;
list.head.Prev=node;
list.head=node;
end
list.size=list.size+1;
end
%从链表的头部删除一个元素
function deletefromhead(list)
if isempty(list.head)
disp('The linked list is empty\n');
list.size=0;
return;
else
list.head=list.head.Next;
list.head.Prev=[];
list.size=list.size-1;
end
end
%从链表的尾部删除一个元素
function deletefromtail(list)
if isempty(list.head)
disp('The linked list is empty\n');
list.size=0;
return;
else
list.tail=list.tail.Prev;
list.tail.Next=[];
list.size=list.size-1;
end
end
%从链表里面选出一个最小值,并删除这个元素
function minnode=delete_min_node(list)
p=list.head.Next;
minp=list.head;
while ~isempty(p)
if(p.Data < minp.Data)
minp=p;
p=p.Next;
else
p=p.Next;
end
end
if ~isempty(minp.Prev) %非头节点
minp.Prev.Next=minp.Next;
minp.Next.Prev=minp.Prev;
list.size=list.size-1;
else
list.head=minp.Next;
list.head.Prev=[];
list.size=list.size-1;
end
minp.Next=[];
minp.Prev=[];
minnode=minp;
end
%正向显示链表
function foredisplay(list)
p=list.head;
while ~isempty(p)
disp(p.Data);
p=p.Next;
end
end
%反向显示链表
function backdisplay(list)
p=list.tail;
while ~isempty(p)
disp(p.Data);
p=p.Prev;
end
end
end
end
3,对链表结构进行简单的测试
close all
clear all
clc
len=8;
%创建len个节点
for i = 1:len
n(i) = node(i);
end
%创建链表,并向链表中插入节点
my_list = list();
for i = 1:len
my_list.insertbeforehead(n(i));
% my_list.insertaftertail(n(i));
end
my_list.foredisplay();
min_node =my_list.delete_min_node();
my_list.foredisplay();
% my_list.deletefromhead();
% my_list.backdisplay();
% my_list.deletefromtail();
% my_list.foredisplay();
4,总结:非常感谢。