C语言数据结构顺序表的操作(创建、插入、删除、查询)
程序员文章站
2022-03-22 19:55:34
...
*顺序表的相关操作
*创建顺序表(顺序存储)
*创建数组
*在指定位置进行删除
*在指定位置进行插入
*返回指定位置的数据
*返回数据的指定位置
*遍历顺序表的数据
*/
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 1024//顺序表的数据最大数目
#define NAME_SIZE 255//字符串的最大长度
#define ERROR 0
#define OK 1
typedef int Statu;//函数返回值的数据类型
typedef char *NameTye;//数据名称的数据类型
typedef int IdType;//数据的编号的数据类型
typedef struct elementtype
{
NameTye name;//数据的名称
IdType id;//数据的编号
}ElementType;//数据域的结构体类型
typedef struct Seq_List
{
ElementType *data;//顺序表指针进行动态赋储存空间
int last;//指向数据下标的指针(类似指针)
}Seq_List;//顺序表的结构体类型
void Init_seqlist(Seq_List*s);//对顺序表进行初始化
Statu create_seqlist(Seq_List*s);//对顺序表进行创建
int delet_position(Seq_List*s,int i);//在指定位置进行删除
int inset_seqlist(Seq_List*s,int i,ElementType key);//在指定位置进行插入
int search_seqlist(Seq_List*s,ElementType key);//返回数据的位置(不是下标)
int search_data_seqlist(Seq_List*s,int i,ElementType *x);//返回指定位置的数据
void Display_seqlist(Seq_List*s);//对顺序表进行遍历
void sort_seqlist(Seq_List*s);//对顺序表进行排序
int value_length_seqlist(Seq_List*s);//计算顺序表的长度
void main()
{
int i;
int index;//要删除数据元素的位置
int index2;//要插入的位置
Seq_List*s;//顺序表指针
int index3;//要返回数据位置的下标
ElementType key;//要插入的数据
ElementType str;//要查询的数据
ElementType x;
s=(Seq_List*)malloc(sizeof(Seq_List)); //对其进行初始化
Init_seqlist(s);//对顺序表进行创建
int result=create_seqlist(s);
if(result==ERROR)
{
printf("顺序表创建失败:\n");
}
else
{
printf("顺序表创建成功:\n");
printf("顺序表遍历的结果为:\n");
Display_seqlist(s);
}
printf("\n");
printf("顺序表的长度为%d\n",value_length_seqlist(s));
printf("对顺序表中的元素排序的结果为:\n");
sort_seqlist(s);
for(i=0;i<s->last+1;i++)
printf("[%s,%d]->",s->data[i].name,s->data[i].id);
printf("\n");//换行
printf("输入要删除的数据的位置:\n");
scanf("%d",&index);
int result1=delet_position(s,index);
if(result1==ERROR)
printf("删除指定节点失败:\n");
else
{
printf("删除指点位置的节点成功:\n");
printf("删除之后数据的遍历结果为:\n");
Display_seqlist(s);
printf("\n");
}
printf("请输入要插入的节点的名称:\n");
key.name=(NameTye)malloc(sizeof(char)*NAME_SIZE);
key.id=rand()%50;//产生随机数字
scanf("%s",key.name);
printf("请输入要插入的位置:\n");
scanf("%d",&index2);
int result2=inset_seqlist(s,index2,key);
if(result2==ERROR)
{
printf("在指定位置插入数据失败:\n");
}
else
{
printf("在指定位置插入节点成功\n");
printf("插入数据之后的遍历的结果为\n");
Display_seqlist(s);
printf("\n");
}
printf("清输入要查找的数据:\n");
str.name=(NameTye)malloc(sizeof(char)*NAME_SIZE);
str.id=rand()%50;//产生随机数字
//对数据名称指针进行动态赋存储空间
scanf("%s",str.name);
int pos=search_seqlist(s,str);
if(pos==ERROR)
{
printf("查询数据失败:\n");
}
else{
printf("查询数据成功\n");
printf("要查询的数据在顺序表中的位置是%d\n",pos);
}
printf("请输入要返回数据位置:\n");
x.name=(NameTye)malloc(sizeof(char)*NAME_SIZE);
//进行动态分配存储空间 让其能存储字符串
scanf("%d",&index3);
int result3=search_data_seqlist(s,index3,&x);
if(result3==ERROR)
{
printf("该数据在顺序表中不存在:\n");
}
else
{
printf("查找数据成功\n");
printf("在顺序表位置为%d的数据为[%s,%d]",index3,x.name,x.id);
}
}
void Init_seqlist(Seq_List*s)
{
s->data=(ElementType*)malloc(sizeof(ElementType)*MAXSIZE);
//对顺序表的数组进行动态赋存储空间
s->last=-1;//last的位置是数据元素在数组中的下标
}
Statu create_seqlist(Seq_List*s)//对顺序表进行创建
{
int i=0;//数组的循环变量
if(s==NULL)
{
return ERROR;//创建失败
}
char str[NAME_SIZE];
printf("请输入数据的名称:\n");
while(scanf("%s",str)!=EOF)
{
if(i+1==MAXSIZE)
break;//跳出while循环
if(strcmp(str,"^")==0)
break;//跳出循环
else
{
s->data[i].name=(NameTye)malloc(sizeof(char)*NAME_SIZE);
strcpy(s->data[i].name,str);
s->data[i].id=rand()%50;//产生随机数据
i++;
s->last++;//将顺序表的指针进行自加
}
}
return OK;
}
void Display_seqlist(Seq_List*s)
{
int i;
if(s==NULL)
printf("链表为空,遍历失败!\n");
else
{
for(i=0;i<s->last+1;i++)
{
printf("[%s,%d]->",s->data[i].name,s->data[i].id);
}
}
}
int value_length_seqlist(Seq_List*s)//计算顺序表的长度
{
return (s->last+1);//顺序表的长度为s->last的长度加一
}
void sort_seqlist(Seq_List*s)//对顺序表进行排序
{
int i=s->last;//需要比较的次数
int j;
int flag=1;
ElementType *t;
t=(ElementType*)malloc(sizeof(ElementType));
while(flag)
{
flag=0;//判断是否继续进行循环的操作
for(j=0;j<i;j++)
{
if(s->data[j].id>s->data[j+1].id)
{
//递增排序
*t=s->data[j];
s->data[j]=s->data[j+1];
s->data[j+1]=*t;//交换数据
flag=1;//循环继续进行标志
}
}
i--;//循环次数减一
}
}
int delet_position(Seq_List*s,int i)//在指定位置进行删除
{
int j;//循环变量
if(s->last==-1)
{
return ERROR;//顺序表为空 删除失败
}
else if(i<=0)
{
return ERROR;//删除位置违法
}
else
{
for(j=i-1;j<=s->last;j++)
{
s->data[j]=s->data[j+1];
}
s->last--;//顺序表的节点个数减一
return OK;
}
}
int inset_seqlist(Seq_List*s,int i,ElementType key)//在指定位置进行插入
{
int j;//循环变量
if(s->last+1>=MAXSIZE)
{
return ERROR;
}
else if(i<=0)
{
return ERROR;
}
else
{
for(j=s->last;j>=i-1;j--)
{
s->data[j+1]=s->data[j];
}
s->data[i-1]=key;
s->last++;//last指针加一
return OK;//插入成功
}
}
int search_seqlist(Seq_List*s,ElementType key)//返回数据的位置(不是下标)
{
int i;//循环变量
for(i=0;i<s->last+1;i++)
{
if(strcmp(s->data[i].name,key.name)==0)
{
break;
}
}
return (i==s->last+1 ? ERROR : i+1 );
}
int search_data_seqlist(Seq_List*s,int i,ElementType *x)//返回指定位置的数据
{
int j;
//对数据的位置进行判断
if(i<=0)//位置违法
return ERROR;
else if(s->last==-1)
return ERROR;//顺序表为空
else
{
x->id=s->data[i-1].id;
strcpy(x->name,s->data[i-1].name);//对字符串进行赋值
return OK;//返回数据成功
}
}
推荐阅读
-
数据结构C语言算法(顺序队列的创建、入队、出队、销毁等操作)
-
手把手教你使用C#操作数据库SQLite,创建数据库,创建表,插入,查询,删除(持续更新)
-
手把手教你使用C#连接并操作数据库SQLite,创建数据库,创建表,插入INSERT,查询SELECT,删除DELETE(持续更新)
-
【数据结构】C/C++ 顺序表的 创建、初始化、增、删、改、查、遍历等基本操作
-
数据结构c(单链表的创建以及插入删除等操作)
-
数据结构之顺序表的基本操作(c语言版)
-
【C语言】【数据结构】顺序线性表(建表、插入、删除、遍历、合并、逆置)
-
数据结构(C语言):双向链表的创建、插入、修改、删除、查找、修改等操作
-
数据结构--链表实现学生信息的创建,插入,删除(C语言实现)
-
数据结构——链表单向链表的创建插入删除遍历操作(C++实现)