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 % classdef2.建立链表类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 end3,对链表结构进行简单的测试
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,总结:非常感谢。