順序表的操作(靜態)
以菜單的形式,顯示線性表的各種操作,界面大概如下圖所示:
各個功能的具體實現
1.聲明順序表
順序表通常有兩種形式,一種靜態的,即通過確定長度的數組來存儲元素。另一種則是動態的,通過動態內存分配,來控制順序表的容量。
#define MAXSIZE 100 //最大容量
typedef int ElemType; //元素的基本數據類型,方便更改
typedef struct SeqList //SeqList可以省略
{
ElemType elem[MAXSIZE];/定長數組;
int length; //有效數字的個數,順序表當前存儲元素的個數;
}SeqList; //這裏的SeqList相當於 struct SeqList 即可以通過SeqList L;直接聲明順序表變量
2.順序表的初始化
由於靜態的順序表在聲明的時候就確定了容量,所以就不用再開闢空間,直接把表長設爲0即可。
void InitList(SeqList *L)
{
L->length=0; //把順序表的長度設置爲0
}
靜態順序表的這一步跟清空順序表的操作一樣,都是把表長設置爲0;
3.判斷順序表是否爲空
如果線性表的長度爲0,那麼這個線性表就爲空;
//判斷線性表是否爲空
int ListEmpty(SeqList L)
{
if(L.length==0)//如果長度爲0,返回1
return 1;
return 0;//默認非空,返回0;
}
4.查找順序表指定位置的元素
順序表的位置比數組的下標大1,要記住的關係。也就是第i個元素的下標爲i-1
//查找指定位置的元素
int GetElem(SeqList L,int i,ElemType *e) //i 表示查詢的位置 ,e用來存儲查詢到的元素
{
if(i<=L.length&&i>=1) //判斷查詢的位置是否合法
{
*e=L.elem[i-1];
return 1;
}
return -1;
}
5.查找指定元素的位置
int LocateElem(SeqList L,ElemType e)//e用來保存指定的元素
{
int i;
for(i=0; i<L.length; i++)
{
if(L.elem[i]==e)
return i+1; //返回值爲元素的位置即第幾個元素
}
return 0;
}
6.向順序表的指定位置插入元素
也就是把要插入的位置空出來,把原來的位置整體右移1位。最後再把順序表的長度加一
int InsertList(SeqList *L,int i,ElemType e) //i 插入的位置 e 插入的元素
{
int j;//移動元素的標號
if(i<1||i>L->length+1)
{
printf("插入位置不合法\n");
return -1;
}
else if (L->length>=MAXSIZE)
{
printf("順序表已滿,不能插入元素\n");
return 0;
}
else
{
for(j=L->length; j>=i; j--)
{
L->elem[j]=L->elem[j-1];//從最右開始依次向右移動一個位置
}
L->elem[i-1]=e;//第i個元素存放我們要插入的元素
L->length=L->length+1;//順序表的長度加1
return 1;
}
}
7.刪除指定位置的元素;
int DeleteList(SeqList *L,int i,ElemType *e)
{
int j;
if(L->length<=0)
{
printf("順序表已被清空,不能進行刪除\n");
return 0;
}
else if(i<1||i>L->length)
{
printf("刪除位置不合適\n");
return -1;
}
else
{
*e=L->elem[i-1];
for (j=i; j<=L->length; j++)
{
L->elem[j-1]=L->elem[j];
}
L->length=L->length-1;
return 1;
}
}
8.順序表的長度
int ListLength(SeqList L)
{
return L.length;
}
9.打印順序表
void PrintList(SeqList L)
{
int i;
if(L.length==0)
{
printf("該順序表爲空!\n");
}
else
{ ElemType *p=0;
p=L.elem;
for(i=1; i<=L.length; i++)
{
printf("%d ",*p);
p++;
}
printf("\n");
}
}
10.求指定元素的前驅和後繼
void QianQv(SeqList L,ElemType i)
{
if(i<1||i>L.length)
printf("輸入不合法\n");
else if(i==1)
printf("該元素無前驅元素\n");
else
printf("該元素的前驅爲%d\n",L.elem[i-1-1]);
}
void HouJi(SeqList L,int i)
{
if(i<1||i>L.length)
printf("輸入不合法\n");
else if(i==L.length)
printf("該元素無後繼元素\n");
else
printf("該元素的後繼元素爲%d\n",L.elem[i]);
}
完整的實現代碼
頭文件SeqList.h
#ifndef SEQLIST_H_INCLUDED
#define SEQLIST_H_INCLUDED
typedef struct
{
ElemType elem[MAXSIZE];//存儲空間基址,相當於數組第一個元素的地址
int length; //表長。元素個數
} SeqList;
//初始化線性表
void InitList(SeqList *L)
{
L->length=0; //把順序表的長度設置爲0
}
//判斷線性表是否爲空
int ListEmpty(SeqList L)
{
if(L.length==0)
return 1;
return 0;
}
//查找指定位置的元素
int GetElem(SeqList L,int i,ElemType *e)
{
if(i<=L.length&&i>=1)
{
*e=L.elem[i-1];
return 1;
}
return -1;
}
//查找指定元素是第幾個
int LocateElem(SeqList L,ElemType e)
{
int i;
for(i=0; i<L.length; i++)
{
if(L.elem[i]==e)
return i+1;
}
return 0;
}
//向順序表的指定位置插入元素
int InsertList(SeqList *L,int i,ElemType e)
{
int j;//移動元素的標號
if(i<1||i>L->length+1)
{
printf("插入位置不合法\n");
return -1;
}
else if (L->length>=MAXSIZE)
{
printf("順序表已滿,不能插入元素\n");
return 0;
}
else
{
for(j=L->length; j>=i; j--)
{
L->elem[j]=L->elem[j-1];//從最右開始依次向右移動一個位置
}
L->elem[i-1]=e;//第i個元素
L->length=L->length+1;//順序表的長度加1
return 1;
}
}
//刪除指定位置的元素;
int DeleteList(SeqList *L,int i,ElemType *e)
{
int j;
if(L->length<=0)
{
printf("順序表已被清空,不能進行刪除\n");
return 0;
}
else if(i<1||i>L->length)
{
printf("刪除位置不合適\n");
return -1;
}
else
{
*e=L->elem[i-1];
for (j=i; j<=L->length; j++)
{
L->elem[j-1]=L->elem[j];
}
L->length=L->length-1;
return 1;
}
}
//順序表的長度
int ListLength(SeqList L)
{
return L.length;
}
void ClearList(SeqList *L)
{
L->length=0;
}
void PrintList(SeqList L)
{
int i;
if(L.length==0)
{
printf("該順序表爲空!\n");
}
else
{
ElemType *p=0;
p=L.elem;
for(i=1; i<=L.length; i++)
{
printf("%d ",*p);
p++;
}
printf("\n");
}
}
void QianQv(SeqList L,ElemType i)
{
if(i<1||i>L.length)
printf("輸入不合法\n");
else if(i==1)
printf("該元素無前驅元素\n");
else
printf("該元素的前驅爲%d\n",L.elem[i-1-1]);
}
void HouJi(SeqList L,int i)
{
if(i<1||i>L.length)
printf("輸入不合法\n");
else if(i==L.length)
printf("該元素無後繼元素\n");
else
printf("該元素的後繼元素爲%d\n",L.elem[i]);
}
#endif // SEQLIST_H_INCLUDED
main.c
文件
typedef int ElemType;//數據類型
#define MAXSIZE 100 //線性表最大長度
#define OK 1
#define OVERFLOW -2
#define Error -1
typedef int Status;//返回值類型
#include <stdio.h>
#include <stdlib.h>
#include "SeqList.h"
void Menu()
{
printf("********順序表的操作*********\n");
printf("0.菜單\n");
printf("1.順序表的初始化\n");
printf("2.判斷順序表是否爲空\n");
printf("3.查詢順序表中第i個元素\n");
printf("4.查詢指定元素是第幾個\n");
printf("5.向指定位置插入指定元素!\n");
printf("6.求出線性表的長度\n");
printf("7.刪除指定位置的元素\n");
printf("8.打印順序表的所有元素\n");
printf("9.求指定元素的前驅和後繼\n");
printf("輸入q退出本程序!\n");
}
int main()
{
SeqList L;//聲明一個線性表L
int i;
char kb;//kb用來接收用戶輸入的序號
ElemType e;//存儲某個位置的元素
Menu();//菜單
InitList(&L);
while(1)
{
printf("請輸入你要進行的操作前面的序號:");
scanf("%c",&kb);
getchar();//拋棄回車符
switch(kb)
{
case '0':
Menu();
case '1':
InitList(&L);
printf("順序表已初始化!\n");
break;
case '2':
if(ListEmpty(L)==0)
printf("線性表不爲空!\n");
else
printf("線性表爲空!\n");
break;
case '3':
printf("請輸入你要查的元素是第幾個:");
scanf("%d",&i);
getchar();
if(GetElem(L,i,&e)==1)
printf("你要查詢的元素的位置爲:%d\n",i);
else
printf("你查詢的位置有誤!\n");
break;
case '4':
printf("請輸入你要查詢的元素:");
scanf("%d",&e);
getchar();
if(LocateElem(L,e))
printf("該元素是第%d個元素\n",LocateElem(L,e));
else
printf("該順序表中沒有該元素!\n");
break;
case '5':
printf("請輸入你要插入的位置:");
scanf("%d",&i);
getchar();
printf("請輸入你要插入的元素:");
scanf("%d",&e);
getchar();
InsertList(&L,i,e);
printf("線性表的長度爲:%d\n",ListLength(L));
break;
case '6':
printf("線性表的長度爲:%d\n",ListLength(L));
break;
case '7':
printf("請輸入你要刪除的位置:");
scanf("%d",&i);
getchar();
DeleteList(&L,i,&e);
if(DeleteList(&L,i,&e)==1)
{
printf("刪除成功,你刪除的元素是%d\n",e);
printf("線性表的長度爲:%d\n",ListLength(L));
}
break;
case '8':
PrintList(L);
break;
case '9':
printf("請輸入你要查詢的位置:");
scanf("%d",&i);
getchar();
QianQv(L,i);
HouJi(L,i);
break;
case 'q':
exit(0);
default:
printf("請檢查你輸入的序號是否正確!\n");
break;
}
}
return 0;
}
最終運行結果
********順序表的操作*********
0.菜單
1.順序表的初始化
2.判斷順序表是否爲空
3.查詢順序表中第i個元素
4.查詢指定元素是第幾個
5.向指定位置插入指定元素!
6.求出線性表的長度
7.刪除指定位置的元素
8.打印順序表的所有元素
9.求指定元素的前驅和後繼
輸入q退出本程序!
請輸入你要進行的操作前面的序號: