线性结构:顺序表

1. 顺序表结构和操作定义

SeqList.h

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define MAXSIZE 100

//定义顺序表结构体
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);		//功能:按关键字查找节点
int SeqListAll(SeqListType *SL);						//功能:遍历顺序表

/*----------------------------------函数实现 start ------------------------------------*/

//功能:初始化顺序表
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("顺序表已满,不能再添加元素!");
		return 0;
	}
	SL->ListData[++SL->ListLen] = data;		//保存数据到顺序表最后
	return 1;
}

//功能:在指定位置插入元素
int SeqListInsert(SeqListType *SL, int n, DATA data){
	if(SL->ListLen >= MAXSIZE){
		printf("顺序表已满,不能再插入数据!");
		return 0;
	}
	if(n<1 || n>SL->ListLen){
		printf("插入位置不合适!");
		return 0;
	}
	for(int 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){
	if(n<1 || n>SL->ListLen){
		printf("删除节点序号不正确,无法执行删除操作!!\n");
		return 0;
	}
	for(int i=n; i< SL->ListLen; i++)
		SL->ListData[i] = SL->ListData[i+1];
	SL->ListLen--;
	printf("成功删除节点!\n");
	return 1;
}

//功能:按序号查找节点
DATA  *SeqListFindByNum(SeqListType *SL, int n){
	if(n<1 || n>SL->ListLen){
		printf("节点序号超出了顺序表范围,无法执行查找操作!!\n");
		return NULL;
	}
	return &(SL->ListData[n]);
}

//功能:按关键字查找节点
int SeqListFindByCont(SeqListType *SL, char *key){
	for(int i=1; i<=SL->ListLen; i++)
		if(strcmp(SL->ListData[i].key, key)==0)
			return i;
	return 0;
}

/*----------------------------------函数实现 end ------------------------------------*/

2. 顺序表操作测试

SeqListTest.cpp

#include<stdio.h>
#include <conio.h>
#include<iostream>
using namespace std;

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

#include "SeqList.h"

//功能:遍历顺序表元素
int SeqListAll(SeqListType *SL){
	for(int 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 select;
	int len, num;
	char key[15];
	DATA data, *data1;
	SeqListType SL;

	do{
		printf("---------------------------\n");
		printf("1.初始化顺序表           2.获取顺序表元素数量\n");
		printf("3.在顺序表末尾添加元素   4.在顺序表指定位置插入元素\n");
		printf("5.删除指定位置的数据     6.返回指定位置的元素\n");
		printf("7.按关键字查找           8.遍历顺序表\n");
		printf("0.退出\n");
		printf("请选择执行的操作序号:");
		//select = getch();
		fflush(stdin);
		scanf("%d", &select);
		switch(select){
			case 1:
				printf("开始初始化顺序表\n");
				SeqListInit(&SL);
				printf("初始化顺序表结束\n");
				break;
			case 2:
				len = SeqListLength(&SL);
				printf("顺序表包括%d个元素!\n", len);
				break;
			case 3:
				printf("请输入添加的节点(学号 姓名  年龄):");
				fflush(stdin);
				scanf("%s %s %d", &data.key, &data.name, &data.age);
				SeqListAdd(&SL, data);
				break;
			case 4:
				printf("请输入插入位置:");
				fflush(stdin);
				scanf("%d", &num);
				printf("请输入添加的节点(学号 姓名  年龄):");
				fflush(stdin);
				scanf("%s %s %d", &data.key, &data.name, &data.age);
				SeqListInsert(&SL, num, data);
				break;
			case 5:
				printf("请输入删除节点的序号:");
				fflush(stdin);
				scanf("%d", &num);
				SeqListDelete(&SL, num);
				break;
			case 6:
				printf("请输入要取出节点的序号:");
				fflush(stdin);
				scanf("%d", &num);
				data1 = SeqListFindByNum(&SL, num);
				if(data1)
					printf("取出的第%d个节点为:(%s,%s,%d)\n", num, data1->key, data1->name, data1->age);
				break;
			case 7:
				printf("请输入要茶轴节点的关键字:");
				fflush(stdin);
				scanf("%s", key);
				num = SeqListFindByCont(&SL, key);
				printf("所查元素是第%d个节点\n", num);
				break;
			case 8:
				printf("顺序表遍历结果为:\n");
				SeqListAll(&SL);
				break;
		}
	}while(select != 0);
	system("pause");
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值