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); 
		}

	}

}

  

posted on 2013-05-24 12:15  elleniou  阅读(5339)  评论(0编辑  收藏  举报