一步步学习线性表

 

线性表数据结构具有以下特征:

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;
}

程序运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值