//顺序表的操作
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
//定义表的最大长度
#define MAXLEN 100
//定义结点的关键字
typedef struct
{
char key[10];
char name[10];
int age;
}DATA;
//定义顺序表的结构
typedef struct
{
DATA ListData[MAXLEN+1];
//表的长度
int Listlen;
}SLType;
//初始化顺序表
void SLInit(SLType *SL)
{
SL->Listlen=0;
//SL->ListData=0;
}
//求顺序表的长度
int SLLength(SLType *SL)
{
return (SL->Listlen);
}
//插入
int SLInsert(SLType *SL,int n,DATA data)
{
int i;
if(SL->Listlen>=MAXLEN)
{
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;
//插入节点后长度增加1
SL->Listlen++;
return 1;
}
//增加元素到顺序表的尾部
int SLAdd(SLType *SL,DATA data)
{
if(SL->Listlen>=MAXLEN)
{
printf("线性表已经满了,不能再添加!\n");
return 0;
}
SL->ListData[++SL->Listlen]=data;
return 1;
}
//删除顺序表中某个数据元素
int SLDelete (SLType *SL,int n)
{
int i;
//删除失败
if(n<1||n>SL->Listlen+1)
{
printf("删除错误结点,不能删除!\n");
return 0;
}
//删除后顺序表中的数据前移
for(i=0;i<SL->Listlen;i++)
{
SL->ListData[i]=SL->ListData[i++];
}
SL->Listlen--;//元素个数减少1
return 1;
}
//根据序号返回数据元素
DATA *SLFindByNum(SLType *SL,int n)
{
if(n<1||n>SL->Listlen+1)
{
printf("结点序号错误\n");
return NULL;
}
//返回要查找的数据
return &(SL->ListData[n]);
}
//按照关键字查找数据
int SLFindByCont(SLType *SL,char *key)
{
int i;
for(i=1;i<=SL->Listlen;i++)
{
//如果找到所需的结点 就返回
if(strcmp(SL->ListData[i].key,key)==0)
{
//返回结点序号
return i;
}
//否则就没找到 ?
return 0;
}
//return 0;
}
//显示顺序表中的所有结点
int SLAll(SLType *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);
}
return 0;
}
int main()
{
int i;
//定义顺序链表
SLType SL;
//结点保存数据
DATA data;
//结点保存指针
DATA *pdata;
//关键字
char key[10];
printf("顺序表操作演示:\n");
//初始化顺序表
SLInit(&SL);
printf("初始化顺序表完成!\n");
//循环添加结点
do
{
printf("输入添加的结点(学号,姓名,年龄):");
//清空输入缓冲区
fflush(stdin);
scanf("%s%s%d",&data.key,&data.name,&data.age);
//跳出死循环
if(data.age)
{
//添加结点失败
if(!SLAdd(&SL,data))
{
break;
}
}
//跳出死循环
else
{
break;
}
} while (1);
printf("\n顺序表中的结点顺序为:\n");
//显示所有的数据
SLAll(&SL);
//清空缓冲区
fflush(stdin);
printf("\n要取出的结点的序号:");
//输入结点序号
scanf("%d",&i);
//按照序号查找结点
pdata=SLFindByNum(&SL,i);
//若返回的结点非空
if(pdata)
{
printf("第%d个结点为:(%d,%s,%d)\n",i,pdata->key,pdata->name,pdata->age);
}
//清空输入缓冲区
fflush(stdin);
printf("要查找的结点的关键字:\n");
scanf("%s",key);
i=SLFindByCont(&SL,key);
//按序号查找,返回结点指针
pdata=SLFindByNum(&SL,i);
if(pdata)
{
printf("第%d个结点为:(%s,%s%d)\n",pdata->key,pdata->name,pdata->age);
getchar();
return 0;
}
}
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
//定义表的最大长度
#define MAXLEN 100
//定义结点的关键字
typedef struct
{
char key[10];
char name[10];
int age;
}DATA;
//定义顺序表的结构
typedef struct
{
DATA ListData[MAXLEN+1];
//表的长度
int Listlen;
}SLType;
//初始化顺序表
void SLInit(SLType *SL)
{
SL->Listlen=0;
//SL->ListData=0;
}
//求顺序表的长度
int SLLength(SLType *SL)
{
return (SL->Listlen);
}
//插入
int SLInsert(SLType *SL,int n,DATA data)
{
int i;
if(SL->Listlen>=MAXLEN)
{
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;
//插入节点后长度增加1
SL->Listlen++;
return 1;
}
//增加元素到顺序表的尾部
int SLAdd(SLType *SL,DATA data)
{
if(SL->Listlen>=MAXLEN)
{
printf("线性表已经满了,不能再添加!\n");
return 0;
}
SL->ListData[++SL->Listlen]=data;
return 1;
}
//删除顺序表中某个数据元素
int SLDelete (SLType *SL,int n)
{
int i;
//删除失败
if(n<1||n>SL->Listlen+1)
{
printf("删除错误结点,不能删除!\n");
return 0;
}
//删除后顺序表中的数据前移
for(i=0;i<SL->Listlen;i++)
{
SL->ListData[i]=SL->ListData[i++];
}
SL->Listlen--;//元素个数减少1
return 1;
}
//根据序号返回数据元素
DATA *SLFindByNum(SLType *SL,int n)
{
if(n<1||n>SL->Listlen+1)
{
printf("结点序号错误\n");
return NULL;
}
//返回要查找的数据
return &(SL->ListData[n]);
}
//按照关键字查找数据
int SLFindByCont(SLType *SL,char *key)
{
int i;
for(i=1;i<=SL->Listlen;i++)
{
//如果找到所需的结点 就返回
if(strcmp(SL->ListData[i].key,key)==0)
{
//返回结点序号
return i;
}
//否则就没找到 ?
return 0;
}
//return 0;
}
//显示顺序表中的所有结点
int SLAll(SLType *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);
}
return 0;
}
int main()
{
int i;
//定义顺序链表
SLType SL;
//结点保存数据
DATA data;
//结点保存指针
DATA *pdata;
//关键字
char key[10];
printf("顺序表操作演示:\n");
//初始化顺序表
SLInit(&SL);
printf("初始化顺序表完成!\n");
//循环添加结点
do
{
printf("输入添加的结点(学号,姓名,年龄):");
//清空输入缓冲区
fflush(stdin);
scanf("%s%s%d",&data.key,&data.name,&data.age);
//跳出死循环
if(data.age)
{
//添加结点失败
if(!SLAdd(&SL,data))
{
break;
}
}
//跳出死循环
else
{
break;
}
} while (1);
printf("\n顺序表中的结点顺序为:\n");
//显示所有的数据
SLAll(&SL);
//清空缓冲区
fflush(stdin);
printf("\n要取出的结点的序号:");
//输入结点序号
scanf("%d",&i);
//按照序号查找结点
pdata=SLFindByNum(&SL,i);
//若返回的结点非空
if(pdata)
{
printf("第%d个结点为:(%d,%s,%d)\n",i,pdata->key,pdata->name,pdata->age);
}
//清空输入缓冲区
fflush(stdin);
printf("要查找的结点的关键字:\n");
scanf("%s",key);
i=SLFindByCont(&SL,key);
//按序号查找,返回结点指针
pdata=SLFindByNum(&SL,i);
if(pdata)
{
printf("第%d个结点为:(%s,%s%d)\n",pdata->key,pdata->name,pdata->age);
getchar();
return 0;
}
}