程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 若何在C++中樹立一個次序表

若何在C++中樹立一個次序表

編輯:關於C++

若何在C++中樹立一個次序表。本站提示廣大學習愛好者:(若何在C++中樹立一個次序表)文章只能為提供參考,不一定能成為您想要的結果。以下是若何在C++中樹立一個次序表正文


預備數據

#define MAXLEN 100 //界說次序表的最年夜長度
struct DATA
{
 char key[10]; //結點的症結字
 char name[20];
 int age;
};
struct SLType //界說次序表構造
{
 DATA ListData[MAXLEN+1];//保留次序表的構造數組
 int ListLen;   //次序表已存結點的數目
};

界說了次序表的最年夜長度MAXLEN、次序表數據元素的類型DATA和次序表的數據構造SLType。

在數據構造SLType中,Listen為次序表已存結點的數目,也就是以後次序表的長度,ListData是一個構造數組,用來寄存各個數據結點。

我們以為該次序表是一個班級先生的記載。個中,key為學號,name為先生的稱號,age為年紀。

由於數組都是從下標0開端的,為了應用便利,我們從下標1開端記載數據結點,下標0的地位弗成用。

初始化次序表

在應用次序表之前,起首創立一個空的次序表,也就是初始化次序表。這裡,在法式中只需設置次序表的結點數目ListLen為0便可。如許,前面須要添加的數據元素將從次序表的第一個地位存儲。
示例代碼:

void SLInit(SLType * SL) //初始化次序表
{
 SL->Listlen=0;
}

盤算線性表的長度

盤算線性表的長度也就是盤算線性表中結點的個數,因為我們在SLType中界說了ListLen來表現結點的數目,所以我們只須要取得這個變量的值便可。

int SLLenght(SLType *SL)
{
 return(SL->ListLen); //前往次序表的元素數目
}

拔出結點

拔出節點就是在線性表L的第i個地位上拔出一個新的結點,使厥後的結點編號順次加1。
這時候,拔出一個新節點以後,線性表L的長度將變成n+1。拔出結點操作的難點在於隨後的每一個結點數據都要向後挪動,盤算機比擬年夜,示例代碼以下:

int SLInsert(SLType *SL,int n,DATA data)
{
 int i;
 if(SL->ListLen>=MAXLEN) //次序表結點數目已跨越最年夜數目
 {
  cout<<"次序表已滿,不克不及拔出結點!"<<endl;
  return 0;   //前往0表現拔出不勝利
 }
 if(n<1||n>SL->ListLen) //拔出結點的序號不正當
 {
  cout<<"拔出序號毛病!"<<endl;
  return 0;
 }
 for(i=SL->ListLen;i>=n;i--) //將次序表中的數據向後挪動
 {
  SL->ListData[i+1]=SL->ListData[i];
 }
 SL->ListData[n]=data;
 SL->ListLen++;
 return 1;
}

在法式中起首斷定次序表結點數目時刻已跨越最年夜數目,和拔出點的序號能否准確。後面前提都瞞住今後,便將次序表中的數據向後挪動,同時拔出結點,並更新結點數目ListLen。

追加結點

追加結點就是在次序表的尾部拔出結點,是以不用停止年夜量數據的挪動,代碼完成與拔出結點比擬就要簡略的多。

int SLAdd(SLType * SL,DATA data)
{
 if(SL->ListLen>=MAXLEN)
 {
  cout<<"次序表已滿,不克不及再添加結點了!"<<endl;
  return 0;
 }
 SL->ListData[++SL->ListLen]=data;
 return 1;
}

刪除結點

刪除結點就是刪除線性表L中的第i個結點,使得厥後的一切節點編號順次減1.這是,刪除一個結點以後,線性表L的長度將變成n-1。刪除結點和拔出結點相似,都須要停止年夜量數據的挪動。

int SLDelete(SLType *SL,int n) //刪除次序表中的數據元素
{
 int i;
 if(n<1||n>SL->ListLen) //刪除結點的序號不正當
 {
  cout<<"刪除序號毛病!"<<endl;
  return 0;
 }
 for(i=n;i<SL->ListLen;i++)//將次序表中的數據向前挪動
 {
  SL->ListData[i]=SL->ListData[i+1];
 }
 SL->ListLen--;   //次序表元素數目減1
 return 1;    //勝利刪除前往1
}

查找結點

查找節點就是在線性表L中查找值為x的結點,並前往該節點在線性表L中的地位。假如在線性表中沒有找到值為x的結點,則前往一個毛病標記。
依據x的類型分歧,查找結點可以分為:

依照序號查找結點

關於一個次序表,序號就是數據元素在數組中的地位,也就是數組的下標標號。依照序號查找結點是次序表查找結點最經常使用的辦法,這是由於次序表的存儲自己就是一個數組,示例代碼以下:

DATA * SLFindByNum(SLType *SL,int n)//依據呼號前往數據元素
{
 if(n<1||n>SL->ListLen)   //查詢結點的序號不正當
 {
  cout<<"查詢序號毛病!"<<endl;
  return 0;
 }
 return &(SL->ListData[n]);
}

依照症結字查找結點

症結字可所以數據元素中的隨意率性一項。
這裡以key症結字為例停止引見,例如,可以經由過程key查找先生的信息。示例代碼以下:

int SLFindByCont(SLType * SL,char *key)//按症結字查詢結點
{
 int i;
 for(i=1;i<=SL->ListLen;i++)
 {
  if(strcmp(SL->ListData[i].key,key)==0)//假如找到結點
  {
   return i;
  }
 }
 return 0;      //在全部表中都沒有找到,前往0
}

顯示一切的結點

示例代碼以下:

void SLALL(SLType *SL)
{
 int i;
 for(i=1;i<SL->ListLen;i++)
 {
  cout<<"key:"<<SL->ListData[i].key<<endl;
  cout<<"name:"<<SL->ListData[i].name<<endl;
  cout<<"age:"<<SL->ListData[i].age<<endl;
  cout<<"============================="<<endl;
 }
}

次序表操作完全示例:

根本上就是把下面的函數放到一塊,集中展現了一下功效,代碼有些長,請耐煩浏覽^.^

#include<iostream>
#include<string>
using namespace std;
#define MAXLEN 100 //界說次序表的最年夜長度
/**************次序表的界說部門*****************/
struct DATA
{
 string key; //結點的症結字
 string  name;
 int age;
};
struct SLType //界說次序表構造
{
 DATA ListData[MAXLEN+1];//保留次序表的構造數組
 int ListLen;   //次序表已存結點的數目
};
/************次序表的初始化函數*****************/
void SLInit(SLType * SL) //初始化次序表
{
 SL->ListLen=0;
}
/***********盤算線性表的長度*******************/
int SLLenght(SLType *SL)
{
 return(SL->ListLen); //前往次序表的元素數目
}
/*********拔出結點*******************************/
int SLInsert(SLType *SL,int n,DATA data)
{
 int i;
 if(SL->ListLen>=MAXLEN) //次序表結點數目已跨越最年夜數目
 {
  cout<<"次序表已滿,不克不及拔出結點!"<<endl;
  return 0;   //前往0表現拔出不勝利
 }
 if(n<1||n>SL->ListLen) //拔出結點的序號不正當
 {
  cout<<"拔出序號毛病!"<<endl;
  return 0;
 }
 for(i=SL->ListLen;i>=n;i--) //將次序表中的數據向後挪動
 {
  SL->ListData[i+1]=SL->ListData[i];
 }
 SL->ListData[n]=data;
 SL->ListLen++;
 return 1;     //勝利拔出,前往1
}
/***********************追加結點*************************/
int SLAdd(SLType * SL,DATA data)
{
 if(SL->ListLen>=MAXLEN)
 {
  cout<<"次序表已滿,不克不及再添加結點了!"<<endl;
  return 0;
 }
 SL->ListData[++SL->ListLen]=data;
 return 1;
}
/***********************刪除結點*************************/
int SLDelete(SLType *SL,int n) //刪除次序表中的數據元素
{
 int i;
 if(n<1||n>SL->ListLen) //刪除結點的序號不正當
 {
  cout<<"刪除序號毛病!"<<endl;
  return 0;
 }
 for(i=n;i<SL->ListLen;i++)//將次序表中的數據向前挪動
 {
  SL->ListData[i]=SL->ListData[i+1];
 }
 SL->ListLen--;   //次序表元素數目減1
 return 1;    //勝利刪除前往1
}
/*******************依照序號查找結點********************/
DATA * SLFindByNum(SLType *SL,int n)//依據序號前往數據元素
{
 if(n<1||n>SL->ListLen)   //查詢結點的序號不正當
 {
  cout<<"查詢序號毛病!"<<endl;
  return 0;
 }
 return &(SL->ListData[n]);
}
/*******************依照症結字查找結點********************/
DATA *SLFindByCont(SLType * SL,string name)//按症結字查詢結點
{
 int i;
 for(i=1;i<=SL->ListLen;i++)
 {
  if(SL->ListData[i].name==name)//假如找到結點
  {
   return &(SL->ListData[i]);
  }
 }
 return 0;      //在全部表中都沒有找到,前往0
}
/*******************顯示一切的結點********************/
void SLALL(SLType *SL)
{
 int i;
 for(i=1;i<=SL->ListLen;i++)
 {
  cout<<"key:"<<SL->ListData[i].key<<",name:"<<SL->ListData[i].name<<",age:"<<SL->ListData[i].age<<endl;
 }
}
int main()
{
 int i;
 SLType SL; //界說次序表變量
 DATA data; //界說結點保留數據類型變量
 DATA *pdata;//界說指向結點的指針變量
 string name;
 cout<<"次序表操作演示:"<<endl;
 SLInit(&SL);//初始化次序表
 do
 { //輪回添加結點數據
  cout<<"請輸出要添加的結點(學號 姓名 年紀):";
  cin>>data.key>>data.name>>data.age;
  if(data.age)  //若年紀不為0
  {
   if(!SLAdd(&SL,data))//若添加結點掉敗
   {
    break;   //加入輪回
   }
  }else
  {
   break;
  }
 }while(1);
 cout<<"次序表中的結點次序為:" <<endl;
 SLALL(&SL);    //顯示一切的結點
 cout<<"請輸出要掏出的結點序號:";
 cin>>i;
 pdata=SLFindByNum(&SL,i);//順次號查找結點
 if(pdata)
 {
  cout<<"第"<<i<<"個結點為:key:"<<pdata->key<<",name:"<<pdata->name<<",age:"<<pdata->age<<endl;
 }
 cout<<"請輸出要查找的姓名:";
 cin>>name;
 pdata=SLFindByCont(&SL,name);
 if(pdata)
 {
  cout<<"key:"<<pdata->key<<",name:"<<pdata->name<<",age:"<<pdata->age<<endl;
 }
 cout<<"請輸出您要刪除的結點的序號:";
 cin>>i;
 if(SLDelete(&SL,i))
 {
  cout<<"數據刪除勝利"<<endl;
  SLALL(&SL); 
 }
 cout<<"請輸出您要拔出的結點的序號:";
 cin>>i;
 cout<<"請輸出第"<<i<<"號結點的key,name,和age"<<endl;
 cin>>data.key>>data.name>>data.age;
 if(SLInsert(&SL,i,data))
 {
  cout<<"拔出數據勝利"<<endl;
  SLALL(&SL); 
 }
 return 0;
}

運轉界面:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved