顺序表结构体增删改查
#ifndef __HEAD1_H__
#define __HEAD1_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int datatype;//int 重定义
#define MAXSIZE 10//线性表长度
//顺序表结构体
typedef struct
{
datatype data[MAXSIZE];
int len;
}seqlist;
seqlist *Create();
int full_fun(seqlist *p);
void insert_rear(seqlist *p,datatype e,int n);
void output(seqlist *p);
int delete_rear(seqlist *p);
int search(seqlist *p,int sub);
int update(seqlist *p,int sub,datatype e);
int insert_bysub(seqlist *p,int sub,datatype e);
int delete_bysub(seqlist *p,int sub);
int search_bykey(seqlist *p,datatype key);
int delete_bykey(seqlist *p,datatype key);
int update_bykey(seqlist *p,datatype key,datatype e);
void Bubble(seqlist *p);
seqlist *free_fun(seqlist *p);
#endif
#include "head1.h"
seqlist *Create()
{
seqlist *p=(seqlist *)malloc(sizeof(seqlist));
if(NULL==p)
return NULL;
p->len=0;
return p;
}
int full_fun(seqlist *p)
{
return p->len==MAXSIZE?-1:0;
}
int empty_fun(seqlist *p)
{
return p->len==0?-1:0;
}
void insert_rear(seqlist *p,datatype e,int n)
{
int i;
for(i=0;i<n;i++){
printf("请输入要插入的第%d个值:",i+1);
scanf("%d",&e);
//判满
if(full_fun(p)){
printf("表满插入失败\n");
return;//结束函数
}
//不满就在尾部插入
p->data[p->len]=e;
p->len++;
}
}
void output(seqlist *p)
{
int i;
for(i=0;i<p->len;i++){
printf("%d\t",p->data[i]);
}
putchar('\n');
}
int delete_rear(seqlist *p)
{
if(empty_fun(p)){
printf("表空\n");
return -1;
}
p->len--;
return 0;
}
int search(seqlist *p,int sub)
{
if(empty_fun(p)||sub<0||sub>=p->len){
printf("查找失败\n");
return -1;
}
printf("查找的元素是:%d\n",p->data[sub]);
return 0;
}
int update(seqlist *p,int sub,datatype e)
{
if(empty_fun(p)||sub<0||sub>=p->len){
printf("修改失败\n");
return -1;
}
p->data[sub]=e;
return 0;
}
int insert_bysub(seqlist *p,int sub,datatype e)
{
if(full_fun(p)||sub<0||sub>p->len){
printf("插入失败\n");
return -1;
}
int i;
for(i=p->len-1;i>=sub;i--){
p->data[i+1]=p->data[i];
}
p->data[sub]=e;
p->len++;
return 0;
}
int delete_bysub(seqlist *p,int sub)
{
//1,判断顺序表是否为空
//2,判断顺序表下标是否合法
if(empty_fun(p)||sub<0||sub>=p->len)
{
printf("删除失败\n");
return -1;
}
for(int i=sub;i<=p->len-1;i++) {
p->data[i]=p->data[i+1];
}
p->len--;
return 0;
}
int search_bykey(seqlist *p,datatype key)
{
for(int i=0;i<p->len;i++)
{
if(key==p->data[i])
{
return i;
}
}
return -1;
}
int delete_bykey(seqlist *p,datatype key)
{
int sub=search_bykey(p,key);
if(sub==-1)
{
printf("删除的元素不存在\n");
return -1;
}
int flag=delete_bysub(p,sub);
if(flag==-1)
{
printf("按元素删除失败\n");
return -1;
}
return 0;
}
int update_bykey(seqlist *p,datatype key,datatype e)
{
int sub=search_bykey(p,key);
if(sub==-1)
{
printf("修改的元素不存在\n");
return -1;
}
int flag=update(p,sub,e);
if(flag==-1)
{
printf("修改失败\n");
return -1;
}
return 0;
}
void Bubble(seqlist *p)
{
if(empty_fun(p)||1==p->len){
printf("表空或者只有一个元素,无需排序\n");
return -1;
}
int i,j;
for(i=0;i<p->len-1;i++){
for(j=0;j<p->len-i-1;j++){
if(p->data[j]>p->data[j+1]){
datatype t=p->data[j];
p->data[j]=p->data[j+1];
p->data[j+1]=t;
}
}
}
}
seqlist *free_fun(seqlist *p)
{
if(NULL!=p){
free(p);
p=NULL;
}
return p;
}
#include "head1.h"
#include "test1.c"
int main(int argc, const char *argv[])
{
seqlist *p=Create();
int n,e;
printf("请输入个数:");
scanf("%d",&n);
//尾部插入
insert_rear(p,e,n);
//尾部删除
delete_rear(p);
printf("\n删除后的结果是\n");
output(p);
//下标查找
int sub;
printf("请输入需要查找的下标:\n");
scanf("%d",&sub);
search(p,sub);
//下标修改
printf("请输入修改的下标:\n");
scanf("%d",&sub);
printf("请输入修改的下标的值:\n");
scanf("%d",&e);
int flag=update(p,sub,e);
if(0==flag)
output(p);
//按下标插入
printf("请输入插入的下标:\n");
scanf("%d",&sub);
printf("请输入插入的值:\n");
scanf("%d",&e);
flag=insert_bysub(p,sub,e);
if(0==flag)
output(p);
//按下标删除
printf("请输入删除的下标:\n");
scanf("%d",&sub);
flag=delete_bysub(p,sub);
if(0==flag)
output(p);
//按元素查找
datatype key;
printf("请输入查找的值:\n");
scanf("%d",&key);
flag=search_bykey(p,key);
if(flag==-1)
printf("查找的值不存在\n");
else
printf("查找的存在,为下标%d\n",flag);
//按元素删除
printf("请输入删除的元素:");
scanf("%d",&key);
flag=delete_bykey(p,key);
if(flag==-1)
printf("按元素删除失败\n");
else
output(p);
//顺序表按元素修改
printf("请输入要修改的元素:");
scanf("%d",&key);
printf("请输入修改后的值:");
scanf("%d",&e);
flag=update_bykey(p,key,e);
if(flag==-1)
printf("修改失败\n");
else
output(p);
//顺序表排序
Bubble(p);
printf("排序后的结果为:");
output(p);
//顺序表空间释放
p=free_fun(p);
return 0;
}