数据结构(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;
}
运行结果:
以上为本次顺序表的全部内容。经本次实验后对于数据的存储、写入以及指针的应用有了初步的认识,希望在下一次的实验中能更好的掌握这些开始阶段的知识。