import java.util.Scanner;
class DATA{ //模擬一個班級的學生記錄
String key;
String name;
int age;
}
class SLType{
static final int MAXLEN = 100;
DATA[] ListData = new DATA[MAXLEN+1];
int ListLen; //順序表已存結點的數量
void SLInit(SLType sl){
sl.ListLen = 0;
}
int SLLength(SLType sl){
return (sl.ListLen);
}
//插入節點
int SLInsert(SLType SL,int n , DATA data){
int i ;
if(SL.ListLen>=MAXLEN){
System.out.println("順序表已滿,不能插入節點");
return 0;
}
if(n<1 || n>SL.ListLen-1){
System.out.println("插入序號有誤,不能插入節點");
return 0;
}
//將順序表中的數據向后移動
for(i = SL.ListLen; i >=n ; i--){
SL.ListData[i+1] = SL.ListData[i];
}
SL.ListData[n] = data;
SL.ListLen++;
return 1;
}
//追加節點
int SLAdd(SLType SL,DATA data){
if(SL.ListLen>=MAXLEN){
System.out.println("順序表已滿,不能插入節點");
return 0;
}
SL.ListData[++SL.ListLen]=data;
return 1;
}
//刪除節點
int SLDelete(SLType SL,int n ){
int i;
if(n<1||n>SL.ListLen+1){
System.out.println("序號輸入有誤,不能插入節點");
return 0;
}
//往前挪
for(i = n ; i<SL.ListLen;i++){
SL.ListData[i] = SL.ListData[i+1];
}
SL.ListLen--;
return 1;
}
//查找節點
DATA SLFindByNum(SLType SL,int n){
if(n<1||n>SL.ListLen+1){
System.out.println("序號輸入有誤,不能插入節點");
return null;
}
return SL.ListData[n];
}
//按照關鍵字查找節點
int SLFindByCont(SLType SL,String key){
int i;
for(i = 1; i <= SL.ListLen ; i++){
if(SL.ListData[i].key.compareTo(key)==0){
return i;
}
}
return 0;
}
//顯示所有節點
int SLAll(SLType SL){
int i;
for(i = 1; i <=SL.ListLen ; i++){
System.out.println(SL.ListData[i].key+"#"+SL.ListData[i].name+"#"+SL.ListData[i].age);
}
return 0;
}
}
public class SequentialList {
public static void main(String[] args) {
int i;
SLType SL=new SLType(); //定義順序表變量
// DATA data=new DATA(); //定義結點保存數據類型變量
DATA pdata; //定義結點保存指針變量
String key; //保存關鍵字
System.out.print("順序表操作演示!\n");
SL.SLInit(SL); //初始化順序表
System.out.print("初始化順序表完成!\n");
Scanner input=new Scanner(System.in);
do
{ //循環添加結點數據
System.out.print("輸入添加的結點(學號 姓名 年齡):");
DATA data=new DATA();
data.key=input.next();
data.name=input.next();
data.age=input.nextInt();
if(data.age!=0) //若年齡不為0
{
if(SL.SLAdd(SL,data)==0) //若添加結點失敗
{
break; //退出死循環
}
}
else //若年齡為0
{
break; //退出死循環
}
}while(true);
System.out.print("\n順序表中的結點順序為:\n");
SL.SLAll(SL); //顯示所有結點數據
System.out.print("\n要取出結點的序號:");
i=input.nextInt(); //輸入結占點序號
pdata=SL.SLFindByNum(SL,i); //按序號查找結點
if(pdata!=null) //若返回的結點指針不為NULL
{
System.out.printf("第%d個結點為:(%s,%s,%d)\n",i,pdata.key,pdata.name,pdata.age);
}
System.out.print("\n要查找結點的關鍵字:");
key=input.next(); //輸入關鍵字
i=SL.SLFindByCont(SL,key); //按關鍵字查找 ,返回結點序號
pdata=SL.SLFindByNum(SL,i); //按序號查詢,返回結點指針
if(pdata!=null) //若結點指針不為NULL
{
System.out.printf("第%d個結點為:(%s,%s,%d)\n",i,pdata.key,pdata.name,pdata.age);
}
}
}