1. 程式人生 > >Lab1 線性表的基本操作及其應用 sqlist linklist

Lab1 線性表的基本操作及其應用 sqlist linklist

實驗要求

1、 建立一個學生表(5個學生);

2、 顯示該表中所有的元素;

3、 根據姓名查詢到第3個學生的資訊並顯示;

4、 插入一個新的學生並顯示全部學生資訊;

5、 刪除第3個學生的資訊並顯示全部學生資訊;

6、 統計學生表中元素的個數(即學生人數);

7、 退出

實驗結果:

能夠順利完成順序表和單鏈表的建立、插入、刪除等操作。

實驗分析:

1、順序表和單鏈表在各種操作實現過程中的差別

2、程式除錯執行中出現的錯誤資訊原因分析。

參考資訊:

Definition of structure student

typedef struct {

    char no[8];   //8位學號

    char name[20]; //姓名

    int  score;     //成績

}Student;

Definition of sequential list:

typedef  struct {

  Student  *elem;     //指向資料元素的基地址

  int  length;       //線性表的當前長度                                                   

 }SqList;

Definition of linked list

typedef struct LNode{

     Student   data;       //資料域

     struct LNode  *next;   //指標域

}LNode,*LinkList;  

順序表如下
#include<stdio.h>
#include<iostream> 
#include<cstdio>
#include<stdlib.h>  
#include<string.h>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -1 
#define Status int
using namespace std;

typedef struct 
{
	char num[10];
	char name[10];
	int age;
	int score;
}Stu;

typedef struct 
{
	Stu *elem;        //儲存空間的基地址 
	int length;       //當前長度 
}SqList;              //順序的結構型別為Sqlist 

//初始化 
Status InitList(SqList &L)           //構造一個空的順序表L 
{
	L.elem=new Stu[MAXSIZE];         //為順序表分配一個大小為MASIZE的陣列空間 
	
	if(!L.elem)   
	   exit(OVERFLOW);               //儲存空間失敗退出 
	   
	L.length=0;                      // 空表長度為0 
	return OK;
}

//取值
Status GetElem(SqList L,Stu &e)
{
	int i;
    if(i<i || i>L.length)  
	    return ERROR;   //判斷i值是否合理,若不合理,返回ERROR 
    
    e=L.elem[i-1];     //elem[i-1]儲存第i個數據元素 
    
	return OK;
} 

//輸入學生資訊 
void input(Stu &e)
{   
	 cout<<"\t\t\t請輸入姓名:"; 	    cin>>e.name;
	 cout<<"\t\t\t請輸入學號:";         cin>>e.num;
	 cout<<"\t\t\t請輸入年齡:"; 	    cin>>e.age; 
	 cout<<"\t\t\t請輸入成績:";         cin>>e.score;
	 cout<<endl; 
}

//顯示學生資訊 
void output(Stu &e)
{  
	printf("\t\t\t|姓名: %-10s  學號: %-10s  年齡: %-3d  成績: %-3d|\n",e.name,e.num,e.age,e.score);
}

//查詢
Status LocatedElem(SqList L,Stu e)
{
	int i;
	for(i=0;i<L.length;i++)      //在L中查詢值為e的資料元素,返回其序號 
	  if(!strcmp(e.name, L.elem[i].name))
	      return i+1;            //查詢成功,返回序號i+1 
	  return 0;                  //查詢失敗,返回0 
}

//插入
Status ListInsert(SqList &L,Stu e,int i)
{//在順序表中第i個位置插入新的元素e,i值合法範圍是1<= i <= L.length+1 
	
	if((i<1) || (i>L.length+1))  //i值不合法 
	   return ERROR;
	   
	if(L.length == MAXSIZE)       //儲存空間已滿 
	   return ERROR;
	 int j;  
	for(j=L.length-1;j>=i-1;j--)
	   L.elem[j+1]=L.elem[j];    //插入位置及之後的元素後移 
	   
	L.elem[i-1]=e;               //將新的元素e放入第i個位置 
	
	++L.length;                  //表長加一 
	
	return OK;    
}
 
//刪除
Status ListDelete(SqList &L,int i) 
{//在順序表中刪除第i個元素,i值合法範圍是1<= i <= L.length+1
   	if((i<1) || (i>L.length+1))  //i值不合法 
	   return ERROR;
	   
	int j; 
	Stu x;                        
	for(j=i; j<=L.length-1; j++)
	{
		  x=L.elem[i-1];                //臨時儲存刪除的元素 
		  L.elem[j-1] = L.elem[j];      //之後的元素前移           	
	}
	   
	--L.length;                         //表長減一
	 
	return OK;    
	
} 

void Print()
{
	cout<<endl;
	cout<<"\t\t\t*————————————————————*"<<endl;
	cout<<"\t\t\t|---------請選擇要執行的功能-------------|"<<endl;
	cout<<"\t\t\t|                                        |"<<endl;
	cout<<"\t\t\t|1.建立連結串列                              |"<<endl;
	cout<<"\t\t\t|                                        |"<<endl;
	cout<<"\t\t\t|2.輸入學生基本資訊                      |"<<endl;
	cout<<"\t\t\t|                                        |"<<endl;
    cout<<"\t\t\t|3.顯示所有學生資訊                      |"<<endl;
    cout<<"\t\t\t|                                        |"<<endl;
	cout<<"\t\t\t|4.查詢資訊                              |"<<endl;
	cout<<"\t\t\t|                                        |"<<endl;
	cout<<"\t\t\t|5.插入資訊                              |"<<endl;
	cout<<"\t\t\t|                                        |"<<endl;
	cout<<"\t\t\t|6.刪除資訊                              |"<<endl;
	cout<<"\t\t\t|                                        |"<<endl;
	cout<<"\t\t\t|7.顯示學生總數                          |"<<endl;
	cout<<"\t\t\t|                                        |"<<endl;
	cout<<"\t\t\t|8.退出系統                              |"<<endl;
	cout<<"\t\t\t|                                        |"<<endl;
	cout<<"\t\t\t*————————————————————*"<<endl<<endl; 
}


int main()
{ 
	Stu e,stu;
	SqList L;
	cout<<"\t\t\t *————————————————————*"<<endl; 
	cout<<"\t\t\t|                                         |"<<endl;
	cout<<"\t\t\t|        歡迎進入學生資訊管理系統         |"<<endl;
    cout<<"\t\t\t|                                         |"<<endl;
	cout<<"\t\t\t *————————————————————*"<<endl<<endl; 
	int n = 1;   
	while(n != 0)
	{
	  Print(); 
	  
	  cout<<"\t\t\t";	     cin>>n;
		 	 
	  if(n<1||n>8)
	  {
	  	cout<<"\t\t\t —————————————————"<<endl; 
	    cout<<"\t\t\t|       輸入錯誤,請重新選擇!     |"<<endl;	   
	  	cout<<"\t\t\t —————————————————"<<endl<<endl; 
	  } 
	 switch(n)
	 {
		case 1:
			if(InitList(L)) 
			{
			   cout<<"\t\t\t * ——————————————————*"<<endl; 
			   cout<<"\t\t\t|          連結串列建立成功!               |"<<endl;
			   cout<<"\t\t\t *——————————————————*"<<endl<<endl;
			}
			else 
			{
			   cout<<"\t\t\t —————————————————"<<endl; 
			   cout<<"\t\t\t|          連結串列建立失敗!          |"<<endl;
			   cout<<"\t\t\t —————————————————"<<endl<<endl;
			}
			break;
			
		case 2:
			cout<<"\t\t\t —————————————————"<<endl;	
			cout<<"\t\t\t|      請輸入學生人數:             |"<<endl;
			cout<<"\t\t\t —————————————————"<<endl<<endl;
			int n1;
			cout<<"\t\t\t";	   cin>>n1;
		      
		    cout<<"\t\t\t —————————————————"<<endl; 
	        cout<<"\t\t\t|       請輸入學生資訊:           |"<<endl;	   
	  	    cout<<"\t\t\t —————————————————"<<endl<<endl;
			for(int i=0; i<n1; i++)
			{
				L.length++;
			    input(L.elem[i]);
			    if(i == n1-1)
			    {
			       cout<<"\t\t\t —————————————————"<<endl; 
			       cout<<"\t\t\t|          輸入結束!               |"<<endl;
			       cout<<"\t\t\t —————————————————"<<endl<<endl;
				}		
			} 
			break;
			
		case 3:
			 cout<<"\t\t\t*——————————————————————————————*"<<endl;
			 for(int i=0;i<L.length;i++)
			 {
			 	 
			 	output(L.elem[i]);
			 
			 } 
			 cout<<"\t\t\t*——————————————————————————————*"<<endl;
			 break;
			 
		case 4:
		    cout<<"\t\t\t —————————————————"<<endl; 
			cout<<"\t\t\t|      請輸入所查詢學生姓名:       |"<<endl;
			cout<<"\t\t\t —————————————————"<<endl<<endl;
			cout<<"\t\t\t"; 	  cin>>e.name;
		    int ans;  
		    ans=LocatedElem(L,e);
			  if(ans!=0)
			  {
			        cout<<"\t\t\t*——————————————————————————————*"<<endl;
			  		output(L.elem[ans-1]);    
			        cout<<"\t\t\t*——————————————————————————————*"<<endl;
			  }            
		      else 
		      {
			       cout<<"\t\t\t * ———————————————————*"<<endl; 
			       cout<<"\t\t\t|     查詢不到此學生資訊,請重新輸入!    |"<<endl;
			       cout<<"\t\t\t * ———————————————————*"<<endl<<endl;
			 }	
			break;
			
		case 5:
			cout<<"\t\t\t * —————————————————*"<<endl; 
			cout<<"\t\t\t|         請輸入要插入的位置:         |"<<endl;
			cout<<"\t\t\t * —————————————————*"<<endl<<endl;
			
			int I;
			cout<<"\t\t\t";   cin>>I;
			
			      cout<<"\t\t\t * —————————————————*"<<endl; 
			      cout<<"\t\t\t|         請輸入插入學生的資訊:       |"<<endl;
			      cout<<"\t\t\t * —————————————————*"<<endl<<endl;
				  	
                   cout<<"\t\t\t姓名:";  
                       cin>>stu.name; 				 
                   cout<<"\t\t\t學號:";  
                       cin>>stu.num;               
                   cout<<"\t\t\t年齡:";  
                       cin>>stu.age;                 
        	       cout<<"\t\t\t成績:";  
                     cin>>stu.score; 
                  
			 
			 if( ! ListInsert(L,stu,I))  
              {
                	cout<<"\t\t\t * —————————————————————————*"<<endl; 
			        cout<<"\t\t\t|           插入位置不合法,請重新輸入!               |"<<endl;
			        cout<<"\t\t\t * —————————————————————————*"<<endl<<endl;
			  } 
            else  
             { 
                  	cout<<"\t\t\t * —————————————————————————*"<<endl; 
			        cout<<"\t\t\t|           插入成功!                                 |"<<endl;
			        cout<<"\t\t\t * —————————————————————————*"<<endl<<endl;
                
              } 
                break; 
                    
		case 6:
			cout<<"\t\t\t * —————————————————*"<<endl; 
			cout<<"\t\t\t|      請輸入要刪除資訊的學生位置:    |"<<endl;
		    cout<<"\t\t\t * —————————————————*"<<endl<<endl;
			    
			int d;
			cout<<"\t\t\t";   cin>>d; 
			    if(ListDelete(L,d) == OK)
			    {
			    	 cout<<"\t\t\t —————————————————"<<endl; 
			         cout<<"\t\t\t|          操作成功!               |"<<endl;
			         cout<<"\t\t\t —————————————————"<<endl<<endl;
				} 
				else 
				{
			    	 cout<<"\t\t\t —————————————————"<<endl; 
			         cout<<"\t\t\t|          操作失敗!              |"<<endl;
			         cout<<"\t\t\t —————————————————"<<endl<<endl;
				}  
			 	break;
			 	
		case 7:
			cout<<"\t\t\t —————————————————"<<endl; 
			cout<<"\t\t\t|          總學生人數為:"<<L.length <<"          |"<<endl;
			cout<<"\t\t\t —————————————————"<<endl<<endl;
			    break;
			
		case 8:
		   
		    cout<<"\t\t\t —————————————————"<<endl; 
			cout<<"\t\t\t|          謝謝您的使用!           |"<<endl;
			cout<<"\t\t\t —————————————————"<<endl<<endl;
		     exit(0);
	} 
}
	return 0;
}
連結串列如下
#include<stdio.h>
#include<iostream> 
#include<cstdio>
#include<stdlib.h>  
#include<string.h>
#include<string>
#define OK 1
#define ERROR 0
#define MAXSIZE 100
#define OVERFLOW -1 
#define Status int
int sum=0;
using namespace std;
typedef struct 
{
	char num[10];
	char name[10];
	int age;
	int score;
}Stu;

//****單鏈表的儲存結構 
typedef struct  LNode 
{
	Stu data;                //結點的資料域 
	struct LNode *next;      //結點的指標域 
}LNode,*LinkList;             //LinkList為指向結構體LNode的指標型別 

//初始化 
Status InitList(LinkList &L)           //構造一個空的單鏈表 
{
	L=new LNode;    //生成新結點作為頭結點 ,用頭指標L指向頭結點 
	
    L->next=NULL;   //頭節點的指標域置空 
	return OK;
}

//取值
Status GetElem(LinkList L,Stu &e)
{//在帶頭結點的單鏈表中根據序號i獲取元素的值,用e返回L中第i個數據元素的值
     int i,j;
     LinkList p;
	 p->next;          //初始化,p指向首元結點,計數器j賦初值為1 
	 j=1;
	 while(p && j<1)     //順鏈域向後掃描,直到p為空或p指向第i個元素 
	 {
	 	p=p->next;      //p指向下一個結點 
	 	++j;            //計數器加1 
	 }
    if(!p || j>i)
      return ERROR;     //i值不合法	
	e=p->data;          //取第i個結點資料域 
	return OK;
} 

//輸入學生資訊 
void input(LinkList &L)
{   
		LinkList p=new LNode;             //疑惑點1   改為LinkList p  不能輸入 
		cout<<"\t\t\t請輸入姓名:"; 
		    cin>>p->data.name; 
		cout<<"\t\t\t請輸入學號:"; 
		    cin>>p->data.num; 
		cout<<"\t\t\t請輸入年齡:"; 
		    cin>>p->data.age; 
		cout<<"\t\t\t請輸入成績:"; 
		    cin>>p->data.score;
		cout<<endl; 
		
		p->next = L->next;               //疑惑點2   去除這兩句不能輸出 
		L->next = p;
		sum++;
}

//顯示學生資訊 
void output(LinkList &L)
{
	LinkList p;
	p = L->next;
	while(p)
	{
		printf("\t\t\t|姓名: %-10s  學號: %-10s  年齡: %-3d  成績: %-3d|\n",p->data.name,p->data.num,p->data.age,p->data.score);
		p=p->next;
	}
}

//查詢
Status LocateElem(LinkList L,Stu &e)
{//在L中查詢值為e的資料元素
    cout<<"\t\t\t";  cin>>e.name;
    LinkList p;
	p=L->next;                   //初始化,指向首元結點 
	int flag = -1;
	while( p )     //順鏈域向後掃描,直到p為空或者p所指結點的資料域等於e 
	{
		if(strcmp(p->data.name , e.name) == 0)
		{
		  printf("\t\t\t|姓名: %-10s  學號: %-10s  年齡: %-3d  成績: %-3d|\n",p->data.name,p->data.num,p->data.age,p->data.score);
            flag = 1;
            break;
		}
		else
	       p = p->next;   
	}
    
	if( !p )
	{
		cout<<"\t\t\t * ———————————————————*"<<endl; 
		cout<<"\t\t\t|     查詢不到此學生資訊,請重新輸入!    |"<<endl;
		cout<<"\t\t\t * ———————————————————*"<<endl<<endl;
	}  
}

//插入
Status ListInsert(LinkList L,Stu e,int i)
{//在連結串列中第i個位置插入新的元素e
  LinkList p;
  LNode *s;
  int j;
  p=L; j=0;
  while(p && j<(i-1))         
  {
  	  p=p->next;            //查詢第i-1個結點,p指向該結點 
   	  ++j;
   } 
  if(!p || j>i-1)         //i>n+1或者i<1 
  {
  	 cout<<"\t\t\t * —————————————————*"<<endl; 
	 cout<<"\t\t\t|           插入位置不合法!           |"<<endl;
	 cout<<"\t\t\t * —————————————————*"<<endl<<endl;
  }
  else
  {
  	 s=new LNode;           //生成新結點*s 
     s->data = e;             //將結點*s的資料域置為e 
     s->next = p->next;       //將結點*s的指標域指向結點ai
     p->next = s;             //將結點*p的指標域指向結點*s 
   
    sum++;             //插入成功總數加一	
    cout<<"\t\t\t * —————————————————*"<<endl; 
	cout<<"\t\t\t|         請輸入插入學生的資訊:       |"<<endl;
	cout<<"\t\t\t * —————————————————*"<<endl<<endl;
				  				  	
    cout<<"\t\t\t姓名:";   cin>>s->data.name; 				 
    cout<<"\t\t\t學號:";   cin>>s->data.num;               
    cout<<"\t\t\t年齡:";   cin>>s->data.age;                 
    cout<<"\t\t\t成績:";   cin>>s->data.score; 
  }
   //  return ERROR;
     
  
					   			
  // return OK; 
} 
 
//刪除
Status ListDelete(LinkList &L,int i) 
{//在帶頭結點的單鏈表L中,刪除第i個元素 
    LinkList p,q;
    int j=0;
    p=L; 
	while((p->next) && (j<i-1))
	{
	  	p = p->next;            //查詢第i-1個結點,p指向該結點 
  	    ++j;
	} 
	 if(!(p->next) || (j>i-1))         //i>n或者i<1時,刪除位置不合理
	   return ERROR;
	 q=p->next;                        //臨時儲存被刪結點以備釋放 
	 p->next=q->next;                  //改變刪除結點前驅結點的指標域 
	 delete q;                         //釋放刪除結點的空間 
	 return OK; 
} 

void Print()
{
	cout<<endl;
	cout<<"\t\t\t*————————————————————*"<<endl;
	cout<<"\t\t\t|---------請選擇要執行的功能-------------|"<<endl;
	cout<<"\t\t\t|                                        |"<<endl;
	cout<<"\t\t\t|1.建立連結串列                              |"<<endl;
	cout<<"\t\t\t|                                        |"<<endl;
	cout<<"\t\t\t|2.輸入學生基本資訊                      |"<<endl;
	cout<<"\t\t\t|                                        |"<<endl;
    cout<<"\t\t\t|3.顯示所有學生資訊                      |"<<endl;
    cout<<"\t\t\t|                                        |"<<endl;
	cout<<"\t\t\t|4.查詢資訊                              |"<<endl;
	cout<<"\t\t\t|                                        |"<<endl;
	cout<<"\t\t\t|5.插入資訊                              |"<<endl;
	cout<<"\t\t\t|                                        |"<<endl;
	cout<<"\t\t\t|6.刪除資訊                              |"<<endl;
	cout<<"\t\t\t|                                        |"<<endl;
	cout<<"\t\t\t|7.顯示學生總數                          |"<<endl;
	cout<<"\t\t\t|                                        |"<<endl;
	cout<<"\t\t\t|8.退出系統                              |"<<endl;
	cout<<"\t\t\t|                                        |"<<endl;
	cout<<"\t\t\t*————————————————————*"<<endl<<endl; 
}

int main()
{ 
	Stu e,stu;
	LinkList p;
	LinkList L;
	cout<<"\t\t\t *————————————————————*"<<endl; 
	cout<<"\t\t\t|                                         |"<<endl;
	cout<<"\t\t\t|        歡迎進入學生資訊管理系統         |"<<endl;
    cout<<"\t\t\t|                                         |"<<endl;
	cout<<"\t\t\t *————————————————————*"<<endl<<endl; 
	int n = 1;   
	while(n != 0)
	{
	  Print(); 
	  
	  cout<<"\t\t\t";
	     cin>>n;
		 	 
	  if(n<1||n>8)
	  {
	  	cout<<"\t\t\t —————————————————"<<endl; 
	    cout<<"\t\t\t|       輸入錯誤,請重新選擇!     |"<<endl;	   
	  	cout<<"\t\t\t —————————————————"<<endl<<endl; 
	  } 
	 switch(n)
	 {
		case 1:
			if(InitList(L)) 
			{
			   cout<<"\t\t\t * ——————————————————*"<<endl; 
			   cout<<"\t\t\t|          連結串列建立成功!               |"<<endl;
			   cout<<"\t\t\t *——————————————————*"<<endl<<endl;
			}
			else 
			{
			   cout<<"\t\t\t —————————————————"<<endl; 
			   cout<<"\t\t\t|          連結串列建立失敗!          |"<<endl;
			   cout<<"\t\t\t —————————————————"<<endl<<endl;
			}
			break;
			
		case 2:
			cout<<"\t\t\t —————————————————"<<endl;	
			cout<<"\t\t\t|      請輸入學生人數:             |"<<endl;
			cout<<"\t\t\t —————————————————"<<endl<<endl;
			int n1;
			cout<<"\t\t\t";  cin>>n1;
		      
		    cout<<"\t\t\t —————————————————"<<endl; 
	        cout<<"\t\t\t|       請輸入學生資訊:           |"<<endl;	   
	  	    cout<<"\t\t\t —————————————————"<<endl<<endl;
			for(int i=0; i<n1; i++)
			{
			    input(L);
			    if(i == n1-1)
			    {
			       cout<<"\t\t\t —————————————————"<<endl; 
			       cout<<"\t\t\t|          輸入結束!               |"<<endl;
			       cout<<"\t\t\t —————————————————"<<endl<<endl;
				}		
			} 
			break;
			
		case 3:
			
			 cout<<"\t\t\t*——————————————————————————————*"<<endl;
			 output(L);
			 cout<<"\t\t\t*——————————————————————————————*"<<endl;
			 break;
			 
		case 4:
			
		    cout<<"\t\t\t —————————————————"<<endl; 
			cout<<"\t\t\t|      請輸入所查詢學生姓名:       |"<<endl;
			cout<<"\t\t\t —————————————————"<<endl<<endl;
			
			LocateElem( L,e);
			break;
			
		case 5:
			cout<<"\t\t\t * —————————————————*"<<endl; 
			cout<<"\t\t\t|         請輸入要插入的位置:         |"<<endl;
			cout<<"\t\t\t * —————————————————*"<<endl<<endl;
			
			int I;
			cout<<"\t\t\t";  cin>>I;			 
			 ListInsert(L,e,I); 
                break; 
                    
		case 6:
			cout<<"\t\t\t * —————————————————*"<<endl; 
			cout<<"\t\t\t|      請輸入要刪除資訊的學生位置:    |"<<endl;
		    cout<<"\t\t\t * —————————————————*"<<endl<<endl;
			    
			int d;
			cout<<"\t\t\t";   cin>>d;
			   
			if(ListDelete(L,d) == OK)
			{
				sum--;              //總刪除成功數減一 
			    cout<<"\t\t\t —————————————————"<<endl; 
			    cout<<"\t\t\t|          操作成功!               |"<<endl;
			    cout<<"\t\t\t —————————————————"<<endl<<endl;
			} 
			else 
			{
			    cout<<"\t\t\t —————————————————"<<endl; 
			    cout<<"\t\t\t|          操作失敗!              |"<<endl;
			    cout<<"\t\t\t —————————————————"<<endl<<endl;
			}  
		     break;
			 	
		case 7:
			cout<<"\t\t\t —————————————————"<<endl; 
			cout<<"\t\t\t|          總學生人數為:"<<sum<<"          |"<<endl;
			cout<<"\t\t\t —————————————————"<<endl<<endl;
			    break;
			
		case 8:
		    
		    cout<<"\t\t\t —————————————————"<<endl; 
			cout<<"\t\t\t|          謝謝您的使用!           |"<<endl;
			cout<<"\t\t\t —————————————————"<<endl<<endl;
		    exit(0);
	} 
}
	return 0;
}