順序表:采用順序存儲方式的線性表稱為順序表
順序存儲結(jié)構(gòu):指的是用一段地址連續(xù)的存儲單元依次存儲線性表的數(shù)據(jù)元素锅尘,由于是依次存放的,因此只要知道順序表的首地址及數(shù)據(jù)元素所占的存儲長度案训,就容易計(jì)算出任何一個(gè)元素的位置
(1)定義順序表的結(jié)構(gòu)
#include <stdio.h>
#include <string.h>
#define MAXSIZE 100 //定義順序表最大長度
typedef struct { //定義數(shù)據(jù)類型
char key[15];
char name[20];
int age;
} DATA;
typedef struct {
DATA ListData[MAXSIZE+1]; //保存順序表數(shù)組
int ListLen; //順序表已存節(jié)點(diǎn)的數(shù)量
} SeqListType;
(2)定義順序表操作
void SeqListInit(SeqListType *SL); //初始化順序表
int SeqListLength(SeqListType *SL); //返回順序表的元素?cái)?shù)量
int SeqListAdd(SeqListType *SL, DATA data); //向順序表中添加元素
int SeqListInsert(SeqListType *SL, int n, DATA data); //向順序表中插入元素
int SeqListDelete(SeqListType *SL, int n); //刪除順序表中的數(shù)據(jù)元素
DATA *SeqListFindByNum(SeqListType *SL, int n); //根據(jù)序號返回元素
int SeqListFindByKey(SeqListType *SL, char *key); //按關(guān)鍵字查找
int SeqListAll(SeqListType *SL); //遍歷順序表的內(nèi)容
** (3)順序表操作**
/*
*初始化順序表
* */
void SeqListInit(SeqListType *SL)
{
SL->ListLen = 0; //設(shè)置順序表長度為0
}
/*
*返回順序表的元素?cái)?shù)量
* */
int SeqListLength(SeqListType *SL)
{
return (SL->ListLen);
}
/*
*向順序表中添加元素
* */
int SeqListAdd(SeqListType *SL, DATA data)
{
if (SL->ListLen >= MAXSIZE) {
printf("順序表已滿,不能再添加節(jié)點(diǎn)!\n");
return 0;
}
SL->ListData[++SL->ListLen] = data;
return 1;
}
/*
*向順序表中插入元素
* */
int SeqListInsert(SeqListType *SL, int n, DATA data)
{
int i;
if (SL->ListLen >= MAXSIZE) {
printf("順序表已滿,不能再添加節(jié)點(diǎn)!\n");
return 0;
}
if (n<1 || n>SL->ListLen-1) {
printf("插入節(jié)點(diǎn)序號錯(cuò)誤乖酬,不能插入元素!\n");
return 0;
}
for (i=SL->ListLen; i>=n; i--) {
SL->ListData[i+1] = SL->ListData[i];
}
SL->ListData[n] = data;
SL->ListLen++;
return 1;
}
/*
*刪除順序表中的數(shù)據(jù)元素
* */
int SeqListDelete(SeqListType *SL, int n)
{
int i;
if (n<1 || n>SL->ListLen+1) {
printf("刪除節(jié)點(diǎn)序號錯(cuò)誤,不能刪除節(jié)點(diǎn)!\n");
return 0;
}
for (i=n; i<SL->ListLen; i++) {
SL->ListData[i] = SL->ListData[i+1];
}
SL->ListLen--;
return 1;
}
/*
*根據(jù)序號返回元素
* */
DATA *SeqListFindByNum(SeqListType *SL, int n)
{
if (n<1 || n>SL->ListLen+1) {
printf("節(jié)點(diǎn)序號錯(cuò)誤融求,不能返回節(jié)點(diǎn)!\n");
return NULL;
}
return &(SL->ListData[n]);
}
/*
*按關(guān)鍵字查找
* */
int SeqListFindByKey(SeqListType *SL, char *key)
{
int i;
for (i=1; i<=SL->ListLen; i++) {
if (strcmp(SL->ListData[i].key, key) == 0)
return i;
}
return 0;
}
/*
*遍歷順序表的內(nèi)容
* */
int SeqListAll(SeqListType *SL)
{
int i;
for (i=1; i<=SL->ListLen; i++) {
printf("(%s,%s,%d)\n", SL->ListData[i].key, SL->ListData[i].name, SL->ListData[i].age);
}
}