zoukankan      html  css  js  c++  java
  • JAVA链表简单实现

    import java.util.Scanner;
    
    
    class DATA2
    {
        String key;  				//结点的关键字 
        String name;
        int age;
    } 
    
    class CLType								//定义链表结构
    {
        DATA2 nodeData=new DATA2();
        CLType nextNode;
        
        
      //追加结点 
        CLType CLAddEnd(CLType head,DATA2 nodeData)  	
        {
            CLType node,htemp;
            if((node=new CLType())==null)
            {
                System.out.print("申请内存失败!\n"); 
                return null;  							//分配内存失败 
            }
        	else
        	{
        		node.nodeData=nodeData; 				//保存数据 
        		node.nextNode=null;  				//设置结点指针为空,即为表尾 
        		if(head==null)  						//头指针 
        		{
        			head=node;
        			return head;
        		}
        		htemp=head;
        		while(htemp.nextNode!=null) 			//查找链表的末尾 
        		{
        			htemp=htemp.nextNode;
        		}
        		htemp.nextNode=node;
        		return head;
        	}
        }
    
        
        //添加头结点
        CLType CLAddFirst(CLType head,DATA2 nodeData) 
        {
            CLType node;
            if((node=new CLType())==null)
            {
                System.out.print("申请内存失败!\n"); 
                return null;  							//分配内存失败 
            }
        	else
        	{
        		node.nodeData=nodeData; 				//保存数据 
        		node.nextNode=head;  					//指向头指针所指结点 
        		head=node;        						//头指针指向新增结点
        		return head; 
        	}
        }
        
      //查找结点
        CLType CLFindNode(CLType head,String key) 		
        {
            CLType htemp;
            htemp=head;       							//保存链表头指针 
            while(htemp!=null)      							//若结点有效,则进行查找 
            {
                if(htemp.nodeData.key.compareTo(key)==0) 		//若结点关键字与传入关键字相同 
        		{
                    return htemp;  						//返回该结点指针 
        		}
                htemp=htemp.nextNode; 					//处理下一结点 
            }
            return null; 								//返回空指针 
        }
      //插入结点 
        CLType CLInsertNode(CLType head,String findkey,DATA2 nodeData)  	
        {
            CLType node,nodetemp;    
            if((node=new CLType())==null) 		//分配保存结点的内容 
            {
                System.out.print("申请内存失败!\n"); 
                return null;  								//分配内存失败 
            }
            node.nodeData=nodeData;  					//保存结点中的数据 
            nodetemp=CLFindNode(head,findkey);
            if(nodetemp!=null)  								//若找到要插入的结点 
            {
                node.nextNode=nodetemp.nextNode;  		//新插入结点指向关键结点的下一结点 
                nodetemp.nextNode=node;    			//设置关键结点指向新插入结点 
            }
        	else
        	{
                System.out.print("未找到正确的插入位置!\n"); 
    //            free(node);								//释放内存
            }
            return head;								//返回头指针
        }
    
        int CLDeleteNode(CLType head,String key)
        {
            CLType node,htemp; 						//node保存删除结点的前一结点 
            htemp=head; 
        	node=head;
            while(htemp!=null)
            {
                if(htemp.nodeData.key.compareTo(key)==0) 		//找到关键字,执行删除操作 
                {
                    node.nextNode=htemp.nextNode;  		//使前一结点指向当前结点的下一结点
    //                free(htemp);  						//释放内存 
                    return 1;
                }
        		else
        		{
                    node=htemp;  						//指向当前结点 
                    htemp=htemp.nextNode; 				//指向下一结点 
                }
             }
             return 0;									//未删除 
        }
    
        int CLLength(CLType head)						//计算链表长度
        {
            CLType htemp;
            int Len=0;
            htemp=head;
            while(htemp!=null)      							//遍历整个链表 
            {
                Len++; 								//累加结点数量 
                htemp=htemp.nextNode;					//处理下一结点 
            }
            return Len;									//返回结点数量 
        }
    
        void CLAllNode(CLType head) 					//遍历链表 
        {
            CLType htemp;
            DATA2 nodeData;
            htemp=head;
            System.out.printf("当前链表共有%d个结点。链表所有数据如下:\n",CLLength(head)); 
            while(htemp!=null) 								//循环处理链表每个结点 
            {
                nodeData=htemp.nodeData;				//获取结点数据 
                System.out.printf("结点(%s,%s,%d)\n",nodeData.key,nodeData.name,nodeData.age); 
                htemp=htemp.nextNode;					//处理下一结点 
            }
        }
      
    }
    
    public class LinkedList {
    
    	public static void main(String[] args) {
    		CLType node, head=null;
    	    CLType CL=new CLType();
    	    String key,findkey;
    	    Scanner input=new Scanner(System.in);
    	    
    	    System.out.print("链表测试。先输入链表中的数据,格式为:关键字 姓名 年龄\n"); 
    	    do
    		{ 
    	    	DATA2 nodeData=new DATA2();
    	        nodeData.key=input.next();
    	       if(nodeData.key.equals("0")) 
    			{
    				break; //若输入0,则退出
    			}
    			else
    			{
    				nodeData.name=input.next();
    				nodeData.age=input.nextInt();
    				head=CL.CLAddEnd(head,nodeData);//在链表尾部添加结点
    			}
    	    }while(true);   
    	    CL.CLAllNode(head); 							//显示所有结点
    	 
    	    System.out.printf("\n演示插入结点,输入插入位置的关键字:") ;
    	    findkey=input.next();  						//输入插入位置关键字 
    	    System.out.print("输入插入结点的数据(关键字 姓名 年龄):");
    	    DATA2 nodeData=new DATA2();
    	    nodeData.key=input.next();
    	    nodeData.name=input.next();
    	    nodeData.age=input.nextInt();//输入插入结点数据 
    	    head=CL.CLInsertNode(head,findkey,nodeData);		//调用插入函数  
    	    CL.CLAllNode(head); 							//显示所有结点
    
    	    System.out.print("\n演示删除结点,输入要删除的关键字:");
    	     
    	    key=input.next();								//输入删除结点关键字 
    	    CL.CLDeleteNode(head,key); 					//调用删除结点函数 
    	    CL.CLAllNode(head); 							//显示所有结点   
    
    	    System.out.printf("\n演示在链表中查找,输入查找关键字:");
    	    key=input.next();							//输入查找关键字 
    	    node=CL.CLFindNode(head,key);					//调用查找函数,返回结点指针 
    	    if(node!=null)									//若返回结点指针有效 
    	    {
    	        nodeData=node.nodeData;				//获取结点的数据 
    	        System.out.printf("关键字%s对应的结点为(%s,%s,%d)\n" ,key,nodeData.key,nodeData.name,nodeData.age);        
    	    }
    		else										//若结点指针无效 
    		{
    	        System.out.printf("在链表中未找到关键字为%s的结点!\n",key); 
    		}
    
    	}
    
    }
    

      

  • 相关阅读:
    TCP源码—连接建立
    TCP系列02—连接管理—1、三次握手与四次挥手
    TCP系列01—概述及协议头格式
    ubuntu软件管理apt与dpkg
    318. Maximum Product of Word Lengths
    317. Shortest Distance from All Buildings
    316. Remove Duplicate Letters
    315. Count of Smaller Numbers After Self
    314. Binary Tree Vertical Order Traversal
    313. Super Ugly Number
  • 原文地址:https://www.cnblogs.com/elleniou/p/3096571.html
Copyright © 2011-2022 走看看