#include<stdio.h>
#include<string.h>
#define MAXSIZE 100 //定义线性表最大长度
typedef struct
{
char key[10]; //结点关键字,即key:学号;name:姓名;age:年龄;
char name[20];
int age;
}DATA;
typedef struct
{
DATA ListData[MAXSIZE+1];
int length;
}SqList;
void SqListInit(SqList *SL)
{
SL->length=0; //初始化空表
}
int getSLLength(SqList *SL)
{
return SL->length; //获取顺序表的长度(个数)
}
/*
1/(n+1)*∑(n-i+1)=n/2 所以时间复杂度为O(n)
*/
int ListInsert_Sq(SqList *SL,int n,DATA data)
{
int i; //循环变量
if(SL->length>=MAXSIZE)
{
printf("顺序表已满!\n");
return 0;
}
if(n<1||n>SL->length-1) //注:插入从1开始,为方便不计算0结点
{
printf("插入元素序号错误,不能插入\n");
return 0;
}
for(i=SL->length;i>=n;i--) //将从n开始的数往后移
{
SL->ListData[i+1] = SL->ListData[i];
}
SL->ListData[n] = data; //放入位置
SL->length++; //长度自增1
return 1;
}
/*
(1/n)*∑(n-i)=(n-1)/2 所以时间复杂度为O(n)
*/
int ListDelete_Sq(SqList *SL,int n)
{
int i;
if(n<1||n>SL->length+1)
{
printf("删除结点序号错误,删除失败!\n");
return 0;
}
for(i=n;i<SL->length;i++) //将表元素向前移
{
SL->ListData[i] = SL->ListData[i+1];
}
SL->length--;
return 1;
}
DATA *SLFindByNum(SqList *SL,int n) //按序号查找
{
if(n<1||n>SL->length+1)
{
printf("结点序号错误!\n");
return NULL;
}
return &(SL->ListData[n]);
}
int SLFindByKey(SqList *SL,char *key) //按关键字查找
{
int i;
for(i=1;i<=SL->length;i++)
{
if(strcmp(SL->ListData[i].key,key)==0)
return i;
}
return 0;
}
int showAll(SqList *SL)
{
int i;
for(i=1;i<=SL->length;i++)
{
printf("(%s,%s,%d)\n",SL->ListData[i].key,SL->ListData[i].name,SL->ListData[i].age);
}
return 0;
}
int ListAdd_Sq(SqList *SL,DATA data) //添加结点
{
if(SL->length>=MAXSIZE)
{
printf("表满,添加失败!\n");
return 0;
}
SL->ListData[++SL->length] = data; //注:0不用
return 1;
}
int main()
{
int i;
int go=1;
SqList SL;
DATA data,*pdata; //结点数据类型变量,结点保存指针变量
char key[10]; //关键字
SqListInit(&SL); //初始化
printf("初始化完成!\n");
while(1)
{
printf("Please input name,key,age...\n");
scanf("%s %s %d",&data.key,&data.name,&data.age);
if(ListAdd_Sq(&SL,data))
printf("添加成功!\n");
printf("继续输入吗?(输入 0 结束)\n");
scanf("%d",&go);
if(!go)
break;
}
printf("顺序表中结点顺序为:\n");
showAll(&SL);
printf("输入结点序号:\n");
scanf("%d",&go);
pdata = SLFindByNum(&SL,go);
if(pdata)
{
printf("第%d个结点为:(%s,%s,%d)\n",go,pdata->key,pdata->name,pdata->age);
}
printf("插入结点序号:\n");
scanf("%d",&go);
scanf("%s %s %d",&data.key,&data.name,&data.age);
if(ListInsert_Sq(&SL,go,data))
{
printf("插入成功,新的表为:\n");
showAll(&SL);
}
}
顺序表
最新推荐文章于 2024-01-22 21:11:54 发布