您的位置:首页 > 编程语言 > Java开发

JAVA链表简单实现

2013-05-24 12:15 387 查看
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);
}

}

}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: