リニアテーブルのデータ構造 - (シーケンシャルストレージ構造)
リニアフォームの論理構造
リニアテーブル定義:
- 線状構造「は、次々に配置されている」データ要素は、格納され、要素の数が限られています。
- アイデンティティ - テーブル内の線形要素タイプデータにおいても同様です。
- リニアテーブル同じデータ型を有するN(N> = 0)は、通常と呼ばれる有限要素の配列:(A 2、A 2、......、A I-1、A I、A I + 1、······、N-)この時間は、我々は、計量I-1である私の直接の前駆体要素、I + 1がある私の直接の後継要素。注:ここで、nテーブルの長さである、= 0は空です。
- 私たちは、関係なく、ストレージ階層のため、二重にリンクされたリストは依然として線形であり、循環リンクリストテーブル論理レベルでのみ議論し、「リニア」と「非線形」と言います。
リニアテーブルの基本的な操作:
異なる用途のために、基本的な動作は線形形態と異なっている、基本的な動作は以下の通りです。
- リニア表初期化:Init_List(L)
- 直線長さについては、表:Length_List(L)
- テーブルの要素を取る:Get_List(L、I、X)
- 値に応じて検索する:Locate_List(L、X)を
- 数値の挿入:Insert_List(L、I、X)
- 数値の削除:Delete_List(L、I、X)
初期挿入操作条件:
-テーブル線形Lの存在を
正しい位置(1 <= I <= Nで- 、nは挿入前にテーブルの長さ)
挿入演算結果後:
···、I I + 1、n個のデータ要素の数になる:I + 1、I i番目の位置の元の行番号テーブルLが作る値xに新たな要素を挿入します+2、···、N + 1、元のテーブルのテーブル長=長さ+ 1に
初期条件を削除します。
- 線形リストLの存在下、1 <= I <= N。
操作の削除結果:
その番号を削除、データ要素の線形リストL i個を除去することである:I + 1、番号I + 2、···、N、のデータ要素になる:I、I + 1、··· 、N - 1、元のテーブル新しいテーブル長=長さ - 1
線状の物理的構造
(A)シーケンシャルストレージ構造とその基本動作
特徴:線形形式の様々な要素を格納するための連続した記憶空間の配列を有するメモリに、また、配列表としても知られています。メモリアドレス空間が連続しているので、それは、単純であり、各データ要素の長い既知シーケンステーブル開始アドレスと終了アドレスは、隣接するセルの数によって占有され、隣接する物理的関係を持つ論理データ要素の間に達成されますランダムアクセスによりシリアルデータの特性を有するテーブル要素の順序でi番目のデータ要素のアドレスを取得することができます。
全体的な線形形式の順次記憶構造は、アドレスの使用を指すは、直線状のデータ要素を記憶し、順次連続したメモリ位置です。
私たちが達成した場合、基本的な動作シーケンステーブルは、相関アルゴリズムを達成するために、我々は、単純な「従業員情報管理システム」を通じて作る手術台と順序アルゴリズムのいくつかの基本的な機能を完了することによって習得することができます。
プロジェクトの要件:
- 各従業員レコードのための労働者の数は「スタッフ情報管理システム」には、名前名、部署番号depno、賃金や給与情報の数が含まれていません。
- 労働者は、レコードを挿入することができます。
- すべての従業員は、レコードを表示することができます。
- すべての従業員レコードのための増分は番号でソートません。
- ソートレコードにすべての従業員のためのセクタ番号ずつDepno。
- レコードをソートするために、すべての労働者の賃金給与の増分の数によると。
- あなたは従業員レコードを削除するには削除することができます。
アレイの容量が必要となるように挿入、欠失、およびその他の操作、テーブル即ち、可変長線形テーブルは、十分に大きく設計します。
以下のコードで連続するデータ要素を記憶することができる50リニアテーブル、すなわち、データ[MaxSizeの]が表され、それはあなたのMaxSizeにそのような定義のMaxSize 50として実際の状況を、応じて設定されると仮定する。
ストレージデータ要素データにおける空間[0]データ[MaxSizeの-1]が、線形テーブルのMaxSize = 50の長さのために利用可能な空間。
商品コード:
#include "stdio.h"
#define MaxSize 50
struct Employee{ //在这里定义一个结构体Employee
int no;
int depno;
char name[10]; //定义char类型数组长度为10来存储员工姓名
float salary;
};
typedef Employee DataType; //将结构体Employee定义为别名DataType,实质上是相等的
typedef struct Seq { //在定义顺序表的同时将顺序表设置为别名LNode。
DataType data[MaxSize]; //即Employee data[MaxSize];
int length;
}LNode;
//线性表的初始化
void Init_List(LNode *L) { //LNode *L 为形参
L->length = 0; //将表中length指针设置为0,表示表中没有元素。
}
//创建线性表来存储员工信息
void Create_List(LNode* L) {
int i = 0, no; //员工编号
Init_List(L); //先初始化表
while (printf("请输入员工编号,以负数结尾\n"), scanf("%d", &no), no > 0)
{ //用户输入的编号小于0停止
L->data[i].no = no; //将用户输入的编号no放到表中的data[i]中,第一个元素i=0
printf("请输入员工姓名、部门编号、员工薪水,用空格隔开。\n");
scanf("%s%d%f", L->data[i].name, &L->data[i].depno, &L->data[i].salary);
i++; //当用户输入第一个元素后i++表示接着存入第二个元素
}
L->length = i; //长度赋值 //停止输入后i即为表长,赋值给表中的length
}
//输出员工相关信息
void display(LNode* L) {
int i;
for (i = 0; i < L->length; i++){
printf("%d %s %d %.2f\n", L->data[i].no, L->data[i].name, L->data[i].depno, L->data[i].salary);}
printf(" \n");
}
//按照员工薪水对员工信息进行排序(升序)
void sort_salary(LNode *L){
int i,k,n;Employee t; //定义一个中间值t来进行交换
n=L->length; //表长赋值为 n
for (i = 1; i < n; i++){ //外循环的次数小于表长 n
for ( k = 0; k < n - i; k++) {
if (L->data[k].salary > L->data[k+1].salary){ //当表中前面一个薪水大于后面一个时交换
t = L->data[k];
L->data[k]= L->data[k+1];
L->data[k+1]=t;
}
}
}
printf("按照薪水的排序如下:\n");
}
//按照员工的部门编号排序(升序)
void sort_depno(LNode *L){
int i,k,n;Employee t;
n=L->length;
for (i = 1; i < n; i++){
for ( k = 0; k < n - i; k++) {
if (L->data[k].depno > L->data[k+1].depno){
t = L->data[k];
L->data[k]= L->data[k+1];
L->data[k+1]=t;
}
}
} printf("按照部门编号的排序如下:\n");
}
//按员工编号排序(升序)
void sort_no(LNode *L){
int i,k,n;Employee t;
n=L->length;
for (i = 1; i < n; i++){
for ( k = 0; k < n - i; k++) {
if (L->data[k].no > L->data[k+1].no){
t = L->data[k];
L->data[k]= L->data[k+1];
L->data[k+1]=t;
}
}
}
printf("按照员工编号的排序如下:\n");
}
//插入员工信息
void inputEmp(LNode *L,int i,Employee t){
int k;
if(i<1|| i>L->length+1){//插入的位置小于表长或超过表长+1(前面会有一个空值)时就不能插入
printf("插入位置不合理\n");}
for(k=L->length-1; k>=i-1;k--) //当插入的位置合理时,将该位置(i)及其后面元素后移
L->data[k+1] = L->data[k]; //L->data[k]为最后一个元素,将其向后移L->data[k+1]
L->data[i-1]=t; //全部后移后将t中的元素放入已置空的L->data[i-1]中
L->length++; //插入一个元素后表长+1
}
//根据职工编号删除员工信息
void deleteEmp(LNode *L,int eno){
int i,k;
for(i=0;i<L->length;i++){
if(L->data[i].no==eno) break; //循环查找表中员工编号为 eno的员工信息,
}
if(i<L->length){
for(k=i;k<L->length-1;k++)
L->data[k]=L->data[k+1];
}
L->length--;
}
void main(){
LNode List;
int i;
Employee t;
Create_List(&List);
sort_salary(&List);
display(&List);
sort_depno(&List);
display(&List);
sort_no(&List);
display(&List);
printf("插入员工信息(编号,姓名,部门编号,薪水)\n");
printf("请先输入要插入的位置: \n");
scanf("%d",&i);
printf("请再输入员工编号、姓名、部门编号、薪水\n");
scanf("%d%s%d%f",&t.no,t.name,&t.depno,&t.salary);
inputEmp(&List,i,t);
display(&List);
printf("请输入要删除的职工编号\n");
scanf("%d",&i);
deleteEmp(&List,i);
printf("职工编号为%d的员工信息已被删除!\n",i);
display(&List);
}