matlab实现链表操作

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,总结:非常感谢。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值