顺序表的基本操作
//头文件
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXSIZE 10
typedef int datatype;
typedef struct
{
datatype data[MAXSIZE];//线性表长度
int len; //顺序表长度
}Seqlist,*seqlist;
//顺序表和结构体嵌套
typedef struct
{
char name[10];
char color[10];
int price;
}Car;
typedef struct
{
Car data1[MAXSIZE];
int len1;
}Seqlist1,*seqlist1;
Seqlist *create();
int full_sel(seqlist p);
int insert_sel(seqlist p,datatype e);
int empty_sel(seqlist p);
void output(seqlist p);
int delete_rear(seqlist p);
int search_sub(seqlist p,int sub);
int update_sub(seqlist p,int sub,datatype e);
int insert_sub(seqlist p,int sub,datatype e);
int delete_sub(seqlist p,int sub);
int search_data(seqlist p,datatype e);
int update_data(seqlist p,datatype e,int key);
int delete_data(seqlist p,datatype e);
int insert_data(seqlist p,datatype e,datatype key);
void removesame(seqlist p);
void sort(seqlist p);
void Com(seqlist p,seqlist q,seqlist pq);
seqlist release(seqlist p);
#endif
//功能函数
#include "head.h"
//在堆区创建顺序表
Seqlist *create() //或seqlist create()
{
Seqlist *p=(Seqlist *)malloc(sizeof(Seqlist));
if(p==NULL)
return NULL; //失败返回NULL
p->len=0; //顺序表的数据元素个数为0
return p; //成功返回首地址
}
//判断顺序表是否满
//成功返回0,失败返回-1
int full_sel(seqlist p)
{
if(p->len==MAXSIZE)
{
printf("顺序表为满\n");
return -1;
}
else
return 0;
}
//顺序表尾插入
//成功返回0,失败返回-1
int insert_sel(seqlist p,datatype e)
{
if(p==NULL || full_sel(p))
{
printf("尾部插入失败\n");
return -1;
}
p->data[p->len]=e;
p->len++;
return 0;
}
//判断顺序表是否空
//成功返回0,失败返回-1
int empty_sel(seqlist p)
{
if(p->len==0)
{
printf("顺序表为空\n");
return -1;
}
else
return 0;
}
//遍历输出
void output(seqlist p)
{
if(p==NULL || empty_sel(p))
{
printf("遍历输出失败\n");
}
for(int i=0;i<p->len;i++)
{
printf("%d\t",p->data[i]);
}
putchar(10);
}
//尾删
int delete_rear(seqlist p)
{
if(p==NULL || empty_sel(p))
{
printf("删除失败\n");
return -1;
}
printf("实现一次尾部删除\n");
p->len--;
return 0;
}
//按下标查找
int search_sub(seqlist p,int sub)
{
if(p==NULL || empty_sel(p) || sub<0 || sub>=p->len)
{
printf("按下标查找失败\n");
return -1;
}
printf("根据下标%d查找的元素是:%d\n",sub,p->data[sub]);
return 0;
}
//按下标修改
int update_sub(seqlist p,int sub,datatype e)
{
if(p==NULL || empty_sel(p) || sub<0 || sub>=p->len)
{
printf("按下标修改失败\n");
return -1;
}
p->data[sub]=e;
return 0;
}
//按下标插入
int insert_sub(seqlist p,int sub,datatype e)
{
if(p==NULL || full_sel(p) || sub<0 || sub>p->len) //可以插入到最后一位
{
printf("按下标插入失败\n");
return -1;
}
for(int i=p->len;i>sub;i--)
{
p->data[i]=p->data[i-1];
}
p->len++;
p->data[sub]=e;
return 0;
}
//按下标删除
int delete_sub(seqlist p,int sub)
{
if(p==NULL || empty_sel(p) || sub<0 || sub>=p->len)
{
printf("按下标删除失败\n");
return -1;
}
for(int i=sub;i<p->len;i++)
{
p->data[i]=p->data[i+1];
}
p->len--;
return 0;
}
//按元素查找
int search_data(seqlist p,datatype e)
{
if(p==NULL || empty_sel(p))
{
printf("按元素查找失败\n");
return -1;
}
for(int i=0;i<p->len;i++)
{
if(e==p->data[i])
{
return i; //成功返回下标
}
}
return -1;
}
//按元素修改
int update_data(seqlist p,datatype e,datatype key)
{
int result=search_data(p,e);
if(result==-1)
{
printf("按元素修改失败\n");
return -1;
}
update_sub(p,result,key);
return 0;
}
//按元素删除
int delete_data(seqlist p,datatype e)
{
int result=search_data(p,e);
if(result==-1)
{
printf("按元素删除失败\n");
return -1;
}
delete_sub(p,result);
return 0;
}
//在元素后继位置插入新的元素
int insert_data(seqlist p,datatype e,datatype key)
{
int result=search_data(p,e);
if(result==-1)
{
printf("在元素后继位置插入失败\n");
return -1;
}
insert_sub(p,result+1,key);
return 0;
}
//去重
void removesame(seqlist p)
{
int i,j;
for(i=0;i<p->len;i++)
{
for(j=i+1;j<p->len;j++)
{
if(p->data[i]==p->data[j])
{
delete_sub(p,j);
j--;
}
}
}
}
//排序
void sort(seqlist p)
{
int i,j,t;
for(i=1;i<p->len;i++)
{
for(j=0;j<(p->len)-i;j++)
{
if(p->data[j]>p->data[j+1])
{
t=p->data[j];
p->data[j]=p->data[j+1];
p->data[j+1]=t;
}
}
}
}
//合并
void Com(seqlist p,seqlist q,seqlist pq)
{
int i=0,j=0,k=0;
sort(p);
sort(q);
while(i<p->len && j<q->len && k<MAXSIZE)
{
if(p->data[i]<=q->data[j])
{
pq->data[k]=p->data[i];
i++;
k++;
pq->len++;
}
else
{
pq->data[k]=q->data[j];
j++;
k++;
pq->len++;
}
}
while(i<p->len && k<MAXSIZE)
{
pq->data[k]=p->data[i];
i++;
k++;
pq->len++;
}
while(j<q->len && k<MAXSIZE)
{
pq->data[k]=q->data[j];
j++;
k++;
pq->len++;
}
}
//释放
seqlist release(seqlist p)
{
if(p==NULL)
return NULL;
free(p);
p=NULL;
return p;
}
//主函数
#include "head.h"
int main(int argc, const char *argv[])
{
seqlist p=create();
int n;
datatype e;
printf("----------------------------------\n");
printf("请输入要插入的元素个数:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("请输入要插入的数据:");
scanf("%d",&e);
insert_sel(p,e);
}
output(p);
printf("----------------------------------\n");
delete_rear(p);
output(p);
printf("----------------------------------\n");
int sub;
printf("请输入查找的下标:");
scanf("%d",&sub);
search_sub(p,sub);
printf("----------------------------------\n");
printf("请输入修改的下标:");
scanf("%d",&sub);
printf("请输入修改后的值:");
scanf("%d",&e);
update_sub(p,sub,e);
output(p);
printf("----------------------------------\n");
printf("请输入插入的下标:");
scanf("%d",&sub);
printf("请输入插入的值:");
scanf("%d",&e);
insert_sub(p,sub,e);
output(p);
printf("----------------------------------\n");
printf("请输入要删除的下标:");
scanf("%d",&sub);
delete_sub(p,sub);
output(p);
printf("----------------------------------\n");
printf("请输入查找的元素:");
scanf("%d",&e);
sub=search_data(p,e);
if(sub==-1)
{
printf("查找失败\n");
}
else
{
printf("查找的元素%d的下标:%d\n",e,sub);
}
printf("----------------------------------\n");
datatype key;
printf("请输入要修改的元素:");
scanf("%d",&e);
printf("请输入修改后的元素:");
scanf("%d",&key);
update_data(p,e,key);
output(p);
printf("----------------------------------\n");
printf("请输入要删除的元素:");
scanf("%d",&e);
delete_data(p,e);
output(p);
printf("----------------------------------\n");
printf("请输入要在哪个元素后插入:");
scanf("%d",&e);
printf("请输入要插入的新元素:");
scanf("%d",&key);
insert_data(p,e,key);
output(p);
printf("----------------------------------\n");
printf("删除重复的元素\n");
removesame(p);
output(p);
printf("----------------------------------\n");
printf("顺序表排序\n");
sort(p);
output(p);
printf("----------------------------------\n");
seqlist p1=create();
printf("请输入顺序表p1要插入的元素个数:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("请输入要插入的数据:");
scanf("%d",&e);
insert_sel(p1,e);
}
output(p1);
seqlist p2=create();
printf("请输入顺序表p2要插入的元素个数:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("请输入要插入的数据:");
scanf("%d",&e);
insert_sel(p2,e);
}
output(p2);
seqlist p12=create();
printf("合并p1和p2\n");
Com(p1,p2,p12);
output(p1);
output(p2);
output(p12);
printf("----------------------------------\n");
printf("已释放空间\n");
p1=release(p1);
p2=release(p2);
p12=release(p12);
p=release(p);
return 0;
}
执行结果
//顺序表的增删改查操作
----------------------------------
请输入要插入的元素个数:5
请输入要插入的数据:12
请输入要插入的数据:95
请输入要插入的数据:6
请输入要插入的数据:11
请输入要插入的数据:77
12 95 6 11 77
----------------------------------
实现一次尾部删除
12 95 6 11
----------------------------------
请输入查找的下标:0
根据下标0查找的元素是:12
----------------------------------
请输入修改的下标:0
请输入修改后的值:13
13 95 6 11
----------------------------------
请输入插入的下标:1
请输入插入的值:11
13 11 95 6 11
----------------------------------
请输入要删除的下标:3
13 11 95 11
----------------------------------
请输入查找的元素:95
查找的元素95的下标:2
----------------------------------
请输入要修改的元素:13
请输入修改后的元素:14
14 11 95 11
----------------------------------
请输入要删除的元素:11
14 95 11
----------------------------------
请输入要在哪个元素后插入:14
请输入要插入的新元素:11
14 11 95 11
----------------------------------
删除重复的元素
14 11 95
----------------------------------
顺序表排序
11 14 95
----------------------------------
已释放空间
//合并顺序表的执行结果
请输入顺序表p1要插入的元素个数:3
请输入要插入的数据:56
请输入要插入的数据:9
请输入要插入的数据:14
56 9 14
请输入顺序表p2要插入的元素个数:4
请输入要插入的数据:77
请输入要插入的数据:11
请输入要插入的数据:26
请输入要插入的数据:89
77 11 26 89
合并p1和p2
9 14 56
11 26 77 89
9 11 14 26 56 77 89