顺序表(SList)

博客围绕顺序表展开,虽未给出具体内容,但顺序表是数据结构中的重要概念,在信息技术领域有广泛应用,可用于存储和管理数据等。
#include<stdio.h>
#include<string.h>

#define MAXLEN 100

typedef struct{
	char key[10];
	char name[20];
	int age;
}DATA;			//key  name  age 

typedef struct{
	DATA ListData[MAXLEN+1];
	int ListLen;
}SLType;

void SLInit(SLType * SL){		//初始化顺序表
	SL->ListLen=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;
	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=n;i<SL->ListLen;i++){
		SL->ListData[i]=SL->ListData[i+1];
	}
	SL->ListLen--;
	return 1;
}

DATA*SLFindByNum(SLType*SL,int n){
	if(n<1||n>SL->ListLen+1){
		printf("节点序号错误,不能返回节点!\n");
		return NULL;
	}
	return &(SL->ListData[n]);
}

int SLFindByCount(SLType*SL,char *key){
	int i;
	for(i=1;i<=SL->ListLen;i++){
		if(strcmp(SL->ListData[i].key,key)==0){				//strcmp  比较字符串是否相等
			return i;
		}
	}
	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个节点为:(%s,%s,%d)\n",i,pdata->key,pdata->name,pdata->age);
	}
	fflush(stdin);
	printf("\n要查找节点的关键字:");
	scanf("%s",key);
	i=SLFindByCount(&SL,key);
	pdata=SLFindByNum(&SL,i);
	if(pdata)
	{
		printf("第%d个节点为:(%s,%s,%d)\n",i,pdata->key,pdata->name,pdata->age);
	}
	getchar();
	return 0;
}

		

编程要求 本关任务是实现 step1/Seqlist.cpp 中的SL_InsAt、SL_DelAt和SL_DelValue三个操作函数,以实现线性表中数据的插入、删除与查找等功能。具体要求如下: SL_InsAT: 在顺序表的位置i插入结点x,即插入d[i]之前,i的有效范围[0,slist->len]; SL_DelAt:删除顺序表slist的第i号结点, i的有效范围应在[0,slist->len)内,否则会产生异常或错误。返回被删除的数据元素的值; SL_DelValue:删除第一个值为x的结点,存在值为x的结点则返回结点编号,未找到返回-1; 输入输出格式请参见后续测试样例。 注意:本关必读中提及的其他操作已经由平台实现,你在实现本关任务的三个操作函数时,在函数体内可调用其他操作。` 本关涉及的代码文件 Seqlist.cpp 中的 3 个操作函数的代码框架如下: bool SL_InsAt(SeqList* slist, int i, T x) // 在顺序表的位置i插入结点x, 插入在d[i]之前。i的有效范围[0,slist->len] { // 请在这里补充代码,完成本关任务 /********** Begin *********/ /********** End **********/ } T SL_DelAt(SeqList* slist, int i) // 删除顺序表slist的第i号结点(i的有效范围应在[0,slist->len)内,否则会产生异常或错误)。返回被删除的数据元素的值。 { // 请在这里补充代码,完成本关任务 /********** Begin *********/ /********** End **********/ } int SL_DelValue(SeqList* slist, T x) // 删除第一个值为x的结点。存在值为x的结点则返回结点编号, 未找到则返回-1 { // 请在这里补充代码,完成本关任务 /********** Begin *********/ /********** End **********/ }
10-11
本关任务:实现 step1/Seqlist.cpp 中的SL_InsAt、SL_DelAt和SL_DelValue三个操作函数,以实现线性表中数据的插入、删除与查找等功能。/************************************************************* date: April 2017 copyright: Zhu En DO NOT distribute this code without my permission. **************************************************************/ // 顺序表操作实现文件 ////////////////////////////////////////////////////////////// #include <stdio.h> #include <stdlib.h> #include "Seqlist.h" SeqList* SL_Create(int maxlen) // 创建一个顺序表。 // 与SqLst_Free()配对。 { SeqList* slist=(SeqList*)malloc(sizeof(SeqList)); slist->data = (T*)malloc(sizeof(T)*maxlen); slist->max=maxlen; slist->len=0; return slist; } void SL_Free(SeqList* slist) // 释放/删除 顺序表。 // 与SqLst_Create()配对。 { free(slist->data); free(slist); } void SL_MakeEmpty(SeqList* slist) // 置为空表。 { slist->len=0; } int SL_Length(SeqList* slist) // 获取长度。 { return slist->len; } bool SL_IsEmpty(SeqList* slist) // 判断顺序表是否空。 { return 0==slist->len; } bool SL_IsFull(SeqList* slist) // 判断顺序表是否满。 { return slist->len==slist->max; } T SL_GetAt(SeqList* slist, int i) // 获取顺序表slist的第i号结点数据。 // 返回第i号结点的值。 { if(i<0||i>=slist->len) { printf("SL_GetAt(): location error when reading elements of the slist!\n"); SL_Free(slist); exit(0); } else return slist->data[i]; } void SL_SetAt(SeqList* slist, int i, T x) // 设置第i号结点的值(对第i号结点的数据进行写)。 { if(i<0||i>=slist->len) { printf("SL_SetAt(): location error when setting elements of the slist!\n"); SL_Free(slist); exit(0); } else slist->data[i]=x; } bool SL_InsAt(SeqList* slist, int i, T x) // 在顺序表的位置i插入结点x, 插入d[i]之前。 // i 的有效范围[0,plist->len]。 { // 请在下面的Begin-End之间补充代码,插入结点。 /********** Begin *********/ /********** End **********/ } T SL_DelAt(SeqList* slist, int i) // 删除顺序表plist的第i号结点。 // i的有效范围应在[0,plist->len)内,否则会产生异常或错误。 // 返回被删除的数据元素的值。 { // 在下面的Begin-End之间补充代码,删除第i号结点。 /********** Begin *********/ /********** End **********/ } int SL_FindValue(SeqList* slist, T x) // 在顺序表表中查找第一个值为x的结点,返回结点的编号。 // 返回值大于等于0时表示找到值为x的结点的编号,-1表示没有找到。 { int i=0; while(i<slist->len && slist->data[i]!=x) i++; if (i<slist->len) return i; else return -1; } int SL_DelValue(SeqList* slist, T x) // 删除第一个值为x的结点。 // 存在值为x的结点则返回结点编号, 未找到返回-1。 { // 在下面的Begin-End之间补充代码,删除第一个值为 x 的结点。 /********** Begin *********/ /********** End **********/ } void SL_Print(SeqList* slist) // 打印整个顺序表。 { if (slist->len==0) { printf("The slist is empty.\n"); return; } //printf("The slist contains: "); for (int i=0; i<slist->len; i++) { printf("%d ", slist->data[i]); } printf("\n"); }
最新发布
10-11
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值