数据结构(1)-线性表- C#顺序表的基本操作

                                                          数据结构(1)-线性表- C#顺序表的基本操作

内容:顺序表的插入、建立、删除。

首先对顺序表进行数据对象的声明

#include<stdio.h>
#include<stdlib.h>

//声明数据类型
typedef struct book
{
	int No;
	char name[20];
}BOOK;

typedef struct bookline
{
	BOOK data[100];
	int len;//长度
}BLine;

接下来进行初始化

//顺序表初始化
void initLine(BLine* bline)
{
	bline->len = 0;
}

下面进行插入操作,在pos(写入的位置)位置上插入新元素,需要在main函数上事先定义函数,

此函数的插入操作只能在代码行输入,不能控制台输入


//在pos位置上插入新元素,需要在main函数上事先定义函数
void insert(BLine* bline, int pos, BOOK newBook)
{
	int i;
	if (bline->len == 100)//data[100] 存储
	{
		printf("书库已经满了!\n");
	}
	else
	{
		if (pos < 1 || pos>100 || pos > bline->len + 1)
		{
			printf("插入元素位置出错!\n");

		}
		else
		{
			for (i = bline->len; i >= pos; i--)
			{
				bline->data[i] = bline->data[i - 1];//在插入元素的位置后面所有元素往后移动一位,为插入位置空出一个位置

			}//移动之前data[i-1]是最后一个元素,因为data[0]为第一个.
			bline->data[pos - 1].No = newBook.No;//在空出位置插入书号
			strcpy(bline->data[pos - 1].name, newBook.name);//插入书名
			bline->len++;
		}
	}
}

上面的函数只能在代码行插入元素,而接下来的函数能在控制台插入,原理跟上面差不多

只不过输入书名书号需自己设置一个输入函数来进行操作,此函数位于插入函数之中。

如下:

//在pos位置上插入新元素,在控制台自行输入
void insertput(BLine* bline, int pos)
{
	BOOK newBook;
	int i;
	if (bline->len == 100)
	{
		printf("书库已满\n");
	}
	else
	{
		if (pos < 1 || pos>100 || pos > bline->len + 1)
		{
			printf("插入位置出错\n");
		}
		else
		{
			newBook = insertloput();//设置的新输入函数,在控制台输入数据后传到newBook;
			for (i = bline->len; i >= pos; i--)
			{
				bline->data[i] = bline->data[i - 1];
			}
			bline->data[pos - 1].No = newBook.No;
			strcpy(bline->data[pos - 1].name, newBook.name);
			bline->len++;
		}
	}


}

新的输入函数为insertloput(),代码如下:

//控制台输入数据
BOOK insertloput()//newBook函数为BOOK型,输入函数也需为BOOK型
{
	BOOK newBook;
	printf("请输入书号\n");
	scanf("%d", &newBook.No);
	printf("请输入书名\n");
	scanf("%s", &newBook.name);
	return newBook;//返回BOOK型

}

插入函数完成后再进行删除操作,删除函数代码如下:

//在pos处删除元素
void delete(BLine* bline, int pos)
{
	int i;
	if (bline->len < 1)
	{
		printf("书库为空!\n");
	}
	else
	{
		if (pos<1 || pos>bline->len)
		{
			printf("删除元素位置出错!\n");

		}
		else
		{
			for (i = pos - 1; i < bline->len - 1; i++)
			{
				bline->data[i] = bline->data[i + 1];
				//将要删除的元素覆盖掉即可删除,即将删除元素下一位元素移动到删除元素位置上,
				//删除元素位置的后面都要向前移动一位
			}
			bline->len--;
		}
	}
}

显示顺序表:

//显示顺序表
void showline(BLine* bline)
{
	int i;
	printf("书号 书名\n");
	printf("-----------------\n");
	for (i = 0; i < bline->len; i++)
	{
		printf("%d %s\n", bline->data[i].No, bline->data[i].name);
	}
	printf("--------------------\n");

}

以上为顺序表建立、插入、删除的内容;

 

 

全部代码如下:

 

 

#include<stdio.h>
#include<stdlib.h>

//声明数据类型
typedef struct book
{
	int No;
	char name[20];
}BOOK;

typedef struct bookline
{
	BOOK data[100];
	int len;//长度
}BLine;

//顺序表初始化
void initLine(BLine* bline)
{
	bline->len = 0;
}

//控制台输入数据
BOOK insertloput()//newBook函数为BOOK型,输入函数也需为BOOK型
{
	BOOK newBook;
	printf("请输入书号\n");
	scanf("%d", &newBook.No);
	printf("请输入书名\n");
	scanf("%s", &newBook.name);
	return newBook;//返回BOOK型

}

//在pos位置上插入新元素,在控制台自行输入
void insertput(BLine* bline, int pos)
{
	BOOK newBook;
	int i;
	if (bline->len == 100)
	{
		printf("书库已满\n");
	}
	else
	{
		if (pos < 1 || pos>100 || pos > bline->len + 1)
		{
			printf("插入位置出错\n");
		}
		else
		{
			newBook = insertloput();//设置的新输入函数,在控制台输入数据后传到newBook;
			for (i = bline->len; i >= pos; i--)
			{
				bline->data[i] = bline->data[i - 1];
			}
			bline->data[pos - 1].No = newBook.No;
			strcpy(bline->data[pos - 1].name, newBook.name);
			bline->len++;
		}
	}


}

//在pos位置上插入新元素,需要在main函数上事先定义函数
void insert(BLine* bline, int pos, BOOK newBook)
{
	int i;
	if (bline->len == 100)//data[100] 存储
	{
		printf("书库已经满了!\n");
	}
	else
	{
		if (pos < 1 || pos>100 || pos > bline->len + 1)
		{
			printf("插入元素位置出错!\n");

		}
		else
		{
			for (i = bline->len; i >= pos; i--)
			{
				bline->data[i] = bline->data[i - 1];//在插入元素的位置后面所有元素往后移动一位,为插入位置空出一个位置

			}//移动之前data[i-1]是最后一个元素,因为data[0]为第一个.
			bline->data[pos - 1].No = newBook.No;//在空出位置插入书号
			strcpy(bline->data[pos - 1].name, newBook.name);//插入书名
			bline->len++;
		}
	}
}

//在pos处删除元素
void delete(BLine* bline, int pos)
{
	int i;
	if (bline->len < 1)
	{
		printf("书库为空!\n");
	}
	else
	{
		if (pos<1 || pos>bline->len)
		{
			printf("删除元素位置出错!\n");

		}
		else
		{
			for (i = pos - 1; i < bline->len - 1; i++)
			{
				bline->data[i] = bline->data[i + 1];
				//将要删除的元素覆盖掉即可删除,即将删除元素下一位元素移动到删除元素位置上,
				//删除元素位置的后面都要向前移动一位
			}
			bline->len--;
		}
	}
}

//显示顺序表
void showline(BLine* bline)
{
	int i;
	printf("书号 书名\n");
	printf("-----------------\n");
	for (i = 0; i < bline->len; i++)
	{
		printf("%d %s\n", bline->data[i].No, bline->data[i].name);
	}
	printf("--------------------\n");

}


int main()
{
	int w, o;
	BLine bl;
	initLine(&bl);

	BOOK newBook1;
	newBook1.No = 100011;
	strcpy(newBook1.name, "c语言程序设计");
	insert(&bl, 1, newBook1);

	BOOK newBook2;
	newBook2.No = 100012;
	strcpy(newBook2.name, "Java语言程序设计");
	insert(&bl, 2, newBook2);

	BOOK newBook3;
	newBook3.No = 100013;
	strcpy(newBook3.name, "数据库原理");
	insert(&bl, 3, newBook3);

	BOOK newBook4;
	newBook4.No = 100014;
	strcpy(newBook4.name, "大数据技术");
	insert(&bl, 4, newBook4);

	BOOK newBook5;
	newBook5.No = 100015;
	strcpy(newBook5.name, "研究生入门考试");
	insert(&bl, 1, newBook5);//插入位置为第一个

	delete(&bl, 5);//删除第五个元素,即大数据技术
	showline(&bl);


	printf("插入输入1,删除输入2:\n");
	scanf("%d", &o);

	while (1)
	{
		if (o == 1)
		{
			printf("要对第()个插入:\n");
			scanf("%d", &w);
			insertput(&bl, w);
			showline(&bl);
		}

		if (o == 2)
		{
			printf("要对第()个删除:\n");
			scanf("%d", &w);
			delete(&bl, w);
			showline(&bl);


		}

		printf("插入输入1,删除输入2:\n");
		scanf("%d", &o);
	}
	return 0;
}

 

运行结果:

 

 

以上为本次顺序表的全部内容。经本次实验后对于数据的存储、写入以及指针的应用有了初步的认识,希望在下一次的实验中能更好的掌握这些开始阶段的知识。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值