資料結構-順序表
阿新 • • 發佈:2020-12-01
順序表
順序表利用 一塊連續的記憶體單元 依次儲存資料元素
順序表的定義:
#define MAXLEN 10 //開闢的總的儲存空間
typedef int DataType; //DataType相當於int的別名
typedef struct {
DataType data[MAXLEN]; //存放順序表的資料,表示最多可以儲存10個元素
int length; //表示順序表已使用的長度
}SeqList;
建立一個空的順序表:
//初始化順序表
void InitList(SeqList *L){
L->length=0; //已使用的長度為0,表示順序表為空
}
建立一個順序表:
//建立線性表
void CreateList(SeqList *L,int n){
int i;
printf("請輸入%d個整數\n",n);
for(i=0;i<n;i++){
scanf("%d", &L->data[i]);
L->length++;
}
}
例如先在順序表中新增9個整數7、8、9、10、11、12、13、14、15
此時順序表的長度應為3
判斷順序表是否為滿/是否為空:
void Full(SeqList *L){ if(L->length>=MAXLEN){ printf("順序表已滿"); return -1; } } void empty(SeqList *L){ if(L->length==0){ printf("順序表為空"); return 0; } }
順序表為滿時的狀態:
向順序表中插入資料:
向順序表中插入資料的前提是: 順序表不為滿
//插入操作 int InsElem(SeqList *L,int i,DataType x) { if(i<1 || i>L->length){ printf("插入的位置出錯"); return 0; } //代表插入位置為表尾 if(i == L->length+1){ L->data[i-1] = x; L->length++; return 1; } //在指定位置插入資料 for(j=L->length-1;j>=i-1;j--){ L->data[j+1]=L->data[j]; } L->data[i-1] = x; L->length++; return 1; }
順序表尾部插入資料:
在指定位置插入資料:
刪除指定位置元素
//刪除操作
int DelElem(SeqList *L,int i,DataType *x){
int j;
*x = L->data[i-1];
for(j=i;j<L->length;j++){
L->data[j-1] = L->data[j];
}
L->length--;
return 1;
}
全部程式碼:
#include<stdio.h>
#define MAXLEN 100 //開闢的總的儲存空間
typedef int DataType; //DataType相當於int的別名,作用範圍為本程式
//定義一個結構體
typedef struct {
DataType data[MAXLEN]; //存放順序表的資料
int length; //順序表的長度
}SeqList; //結構體的名稱
//初始化順序表
void InitList(SeqList *L){
L->length=0; //順序表為空
}
//建立線性表
void CreateList(SeqList *L,int n){
int i;
printf("請輸入%d個整數\n",n);
for(i=0;i<n;i++){
scanf("%d", &L->data[i]);
L->length++;
}
}
int GetElem(SeqList *L,int i,DataType *x){
if(i<1||i>L->length)
return 0;
else{
*x=L->data[i-1];
return 1;
}
}
//按值查詢
int Locate(SeqList *L,DataType x){
int i=0;
while(i<L->length&&L->data[i]!=x)
i++;
if(i>=L->length)
return 0;
else
return i+1;
}
//插入操作
int InsElem(SeqList *L,int i,DataType x)
{
/*在順序表L中在第i位插入新元素x函式*/
int j;
if(L->length>=MAXLEN){
printf("順序表已滿");
return -1;
}
if(i<1 || i>L->length){
printf("插入的位置出錯");
return 0;
}
if(i == L->length){
L->data[i-1] = x;
L->length++;
return 1;
}
for(j=L->length-1;j>=i-1;j--){
L->data[j+1]=L->data[j];
}
L->data[i-1] = x;
L->length++;
return 1;
}
//刪除操作
int DelElem(SeqList *L,int i,DataType *x){
int j;
if(L->length==0){
printf("順序表為空");
return 0;
}
if(i<1 || i>L->length){
printf("不存在第i個元素");
return 0;
}
*x = L->data[i-1];
for(j=i;j<L->length;j++){
L->data[j-1] = L->data[j];
}
L->length--;
return 1;
}
//輸出表中的元素操作
void DispList(SeqList *L){
int i;
for(i=0;i<L->length;i++){
printf("%5d",L->data[i]);
}
}
//顯示選單函式
void Menu(){
printf("\n 順序表的各種操作");
printf("\n===================================");
printf("\n 1.建立順序表 ");
printf("\n 2.插入元素 ");
printf("\n 3.刪除元素 ");
printf("\n 4.按位置查詢元素 ");
printf("\n 5.按元素值查詢其在表中位置 ");
printf("\n 6.求順序表的長度 ");
printf("\n 7.返回 ");
printf("\n===================================");
printf("\n請輸入選單號(0-6):");
}
void main(){
SeqList L; //順序表的名稱
DataType x;
int n,i,loc;
char ch1,ch2,a;
ch1 = 'y';
while(ch1=='y'||ch1=='Y'){
Menu();
scanf("%c",&ch2);
getchar();
switch(ch2){
case '1':
InitList(&L);
printf("請輸入建立線性表的個數:");
scanf("%d",&n);
CreateList(&L,n);
printf("建立的線性表為:");
DispList(&L);
break;
case '2':
printf("請輸入要插入的位置:");
scanf("%d",&i);
printf("請輸入要插入的元素值:");
scanf("%d",&x);
if(InsElem(&L,i,x)){
printf("已成功在%d的位置上插入%d,插入後的線性表為:\n",i,x);
DispList(&L);
} else{
printf("輸入插入的引數錯誤");
}
break;
case '3':
printf("請輸入要刪除的元素的位置:");
scanf("%d",&i);
if(DelElem(&L,i,&x)){
printf("已成功在第%d位置上刪除%d,刪除後的線性表為:\n",i,x);
DispList(&L);
}else{
printf("\n輸入刪除的引數錯誤");
}
break;
case '4':
printf("請輸入要刪查看錶中元素的位置(從1開始):");
scanf("%d",&i);
if(GetElem(&L,i,&x)){
printf("已在當前線性表中的%d的元素的值為:%d\n",i,x);
}else{
printf("\n輸入刪除的位置錯誤");
}
break;
case '5':
printf("請輸入要查詢的元素為:");
scanf("%d",&x);
loc=Locate(&L,x);
if(loc){
printf("查詢元素值%d的位置為:%d",x,loc);
}else{
printf("該表中無此元素!");
}
break;
case '6':
printf("當前線性表的長度為:%d",L.length);
break;
case '0':
ch1='n';
break;
default:
printf("輸入有誤,請輸入0~6進行選擇");
}
if(ch2!='0'){
printf("\n按回車健繼續,按任意鍵返回主選單\n");
a=getchar();
if(a!='\xA'){
getchar();
ch1='n';
}
}
}
}