数据结构3

顺序表的基本操作

//头文件

#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    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值