线性表数据结构具有以下特征:
1)有且只有一个“首元素”
2)有且只有一个“末元素”
3)除末元素之外,其余元素均有唯一的后继元素
4)除首元素之外,其余元素均有唯一的前驱元素
顺序表是线性表的一种最简单和最常用的方式,这种方式用一组地址连续的存储单元依次保存线性表中的数据元素。由于C语言中的数组也是采用顺序存储的方式,因此,可以使用数组来模拟顺序表的保存形式。
顺序表的头文件:SeqList.h
#include<stdio.h>
#include<string.h>
#define MAXSIZE 100 //定义线性表的最大长度
typedef struct // 定义结点类型
{
char key[15]; //结点的关键字
char name[20];
int age;
}DATA;
typedef struct // 定义顺序表的结构
{
DATA ListData[MAXSIZE+1]; //保存顺序表的数组
int ListLen; //顺序表已存结点的数量
}SeqListType;
void SeqListInit(SeqListType *SL); //初始化顺序表
int SeqListLength(SeqListType *SL); //返回顺序表中的元素数目
int SeqListAdd(SeqListType *SL,DATA data); //向顺序表中添加元素
int SeqListInsert(SeqListType *SL,int n,DATA data); //向顺序表中插入元素
int SeqListDelete(SeqListType *SL,int n); //删除元素
DATA *SeqListFindByNum(SeqListType *SL,int n); // 按数组序号返回元素
int SeqListFindByCont(SeqListType *SL,char *key); //按关键字查找
void SeqListAll(SeqListType *SL); //遍历顺序表中的内容
顺序表测试文件:SeqListTest.cpp
#include<stdio.h>
#include<conio.h>
#include"SeqList.h"
void SeqListInit(SeqListType *SL)
{
SL->ListLen=0;
}
int SeqListLength(SeqListType *SL)
{
return(SL->ListLen);
}
int SeqListAdd(SeqListType *SL,DATA data)
{
if(SL->ListLen>=MAXSIZE)
{
printf("顺序表已满,不能再添加节点了!\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("顺序表已满,不能插入节点!\n");
return 0;
}
if(n<1 || n>SL->ListLen-1)
{
printf("插入结点序号错误,不能插入元素!\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;
}
int SeqListDelete(SeqListType *SL,int n)
{
int i;
if(n<1 || n>SL->ListLen+1)
{
printf("删除结点序号错误,不能删除结点!\n");
return 0;
}
for(i=n;i<SL->ListLen;i++)
SL->ListData[i]=SL->ListData[i+1];
SL->ListLen--;
return 1;
}
DATA *SeqListFindByNum(SeqListType *SL,int n)
{
if(n<1 || n>SL->ListLen+1)
{
printf("结点序号错误,不能返回结点!\n");
return NULL;
}
return &(SL->ListData[n]);
}
int SeqListFindByCont(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;
}
void 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);
}
}
int main()
{
int i;
SeqListType SL; //定义顺序表变量
DATA data,*data1;
char key[15];
SeqListInit(&SL); //初始化顺序表
do
{
printf("输入添加的结点(学号 姓名 年龄):");
fflush(stdin);
scanf("%s%s%d",&data.key,&data.name,&data.age);
if(data.age) //若年龄不为0,添加结点
{
if(!SeqListAdd(&SL,data))
break;
}
else //年龄为0,退出循环
break;
}
while(1);
printf("\n顺序表中的结点顺序为:\n");
SeqListAll(&SL);
fflush(stdin); //清空输入缓冲区
printf("\n要取出结点的序号:");
scanf("%d",&i);
data1=SeqListFindByNum(&SL,i);
if(data1) //返回的结点指针不为null
printf("第%d个结点为:(%s,%s,&d)\n",i,data1->key,data1->name,data1->age);
fflush(stdin);
printf("\n要查找结点的关键字:");
scanf("%s",key);
i=SeqListFindByCont(&SL,key);
data1=SeqListFindByNum(&SL,i);
if(data1)
printf("第%d个结点为:(%s,%s,%d)\n",i,data1->key,data1->name,data1->age);
getch();
return 0;
}
程序运行结果: