首页 > 其他分享 >C语言顺序表代码实现

C语言顺序表代码实现

时间:2024-04-10 22:31:30浏览次数:33  
标签:顺序 int 代码 C语言 length void printf data SeqList

声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

设计算法,实现线性结构上的顺序表的产生以及元素的查找、插入与删除,删除k个元素、有序表插入、元素逆置、2个有序表合并等。

#include <stdio.h>
#include <stdlib.h>

//顺序表的定义:
#define ListSize 100		//表空间大小可根据实际需要而定,这里假设为100
typedef int DataType;		//DataType可以是任何相应的数据类型如int, float或char

typedef struct
{	DataType data[ListSize];	//向量data用于存放数据元素 
	int length;				//当前的表长度
}SeqList;

void CreateList(SeqList *L,int n);
void PrintList(SeqList L);
int LocateList(SeqList L,DataType x);
void InsertList(SeqList *L,DataType x,int i);
void DeleteList(SeqList *L,int i);
void DeleteListk(SeqList *L,int i,int k); 
void InsertOrderList(SeqList *va,int x);
void ListOppose_Sq(SeqList *L);
void MergeList_Sq(SeqList L,SeqList Lb,SeqList *Lc);

int main(void)
{
	SeqList L;
	int i,x,k;
	int n=10;				//欲建立的顺序表长度
	L.length=0;

	printf("输入顺序表:");
	CreateList(&L,n);		//建立顺序表
	PrintList(L);			//输出顺序表

	printf("输入要查找的值:");
	scanf("%d",&x);
	i=LocateList(L,x);		//顺序表查找    
	if(i) 
	printf("查找的值所在的位置:%d\n",i);//若找到,输出结点的位置;

	printf("输入要插入的位置和元素:");
	scanf("%d%d",&i,&x);
	InsertList(&L,x,i);		//顺序表插入
	PrintList(L);			//输出顺序表

    printf("输入要删除的位置:");
	scanf("%d",&i);
	DeleteList(&L,i);		//顺序表删除
	PrintList(L);			//输出顺序表  
	
	printf("输入要删除的位置和元素个数:");
	scanf("%d%d",&i,&k) ;
	DeleteListk(&L,i,k); 
	PrintList(L);	
	
	printf("输入要插入的元素:");
	scanf("%d",&x);
	InsertOrderList(&L,x);
	PrintList(L);	
	
	printf("逆置:\n");
	ListOppose_Sq(&L); 
	PrintList(L);
	printf("逆置:\n");
	ListOppose_Sq(&L); 
	PrintList(L);
	
	printf("输入要被合并的顺序表:");
	SeqList Lb;
	SeqList Lc;
	CreateList(&Lb,n);
	MergeList_Sq(L,Lb,&Lc); 
	PrintList(Lc);	
	
	return 0;
}

//顺序表的建立:
void CreateList(SeqList *L, int n)
{
 int i;
 for (i=0;i<n;i++)
	 {scanf("%d",&L->data[i]); // 依次存储数据元素
//1.从键盘输入n个整数,产生顺序表,并输出结点值。
	}
 L->length=n; // 设置顺序表长度
}


//顺序表的输出:
void PrintList(SeqList L)
{
	int i;
 for (i=0;i<L.length;i++)
		printf("%d ", L.data[i]);//1.从键盘输入n个整数,产生顺序表,并输出结点值。
	printf("\n", L.data[i]);
}

//顺序表的查找:
int LocateList(SeqList L,DataType x)//2.从键盘输入1个整数,在顺序表中查找该结点。若找到,输出结点的位置;若找不到,则显示“找不到”。
{
	int c=0;//记录是否找到 
	for (int i=0;i< L.length;i++)
 		if (L.data[i]==x){
		return i+1; 
  		c++;}
	if(c!=0) printf("找不到");
  	return 0;
	}

//顺序表的插入:
void InsertList(SeqList *L,DataType x,int i)
{//3.从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出顺序表所有结点值,观察输出结果。
int j;
if (i<1 || i>L->length+1){
printf(" 插入位置非法 ");
exit(0);
}
if (L->length>=ListSize){
printf(" 表空间溢出,退出运行 ");
exit(0);
}
for (j= L->length-1;j>=i-1;j--)
L->data[j+1]= L->data[j];
L->data[i-1]=x;
L->length++;
}

//顺序表的删除:
void DeleteList(SeqList *L,int i)//4.从键盘输入1个整数,表示欲删除结点的位置,输出顺序表所有结点值,观察输出结果。 
	{// 从 L 所指的顺序表中删除第 i 个结点
int j;
if (i<1 || i> L->length){
printf(" 删除位置非法 ");
exit(0);
}
for (j=i;j<= L->length-1;j++)
L->data[j-1]= L->data[j];
L->length--;
}

//删除第i个元素起的k个元素
void DeleteListk(SeqList *L,int i,int k)
  {
int j;
if (i<1 || i> L->length){
printf(" 删除结点非法 ");
exit(0);
}
int t;
if(i+k-1<L->length)t=L->length-k;
else t=L->length;
for (j=i;j<= t;j++)
L->data[j-1]= L->data[j+k-1];
L->length-=k;
}

//在非递减的顺序表 va中插入元素 x并使其仍成为顺序表的算法
void InsertOrderList(SeqList *va,int x)
{
int i;
if (va->length>=ListSize){
printf("OVERFLOW");
exit(0);}
va->length++;
for(i=va->length;i>0&&x<=va->data[i-2];i--)
va->data[i-1]=va->data[i-2];
va->data[i-1]=x;
}

// 顺序表的逆置
void ListOppose_Sq(SeqList *L) 
{  
int i;   
int x;  
for(i=0;i<(*L).length/2;i++){   
x=(*L).data[i];   (*L).data[i]=(*L).data[L->length-i-1];   (*L).data[L->length-i-1]=x;   
} 
}

// 顺序表的合并 
void MergeList_Sq(SeqList L,SeqList Lb,SeqList *Lc)
{
if (L.length+Lb.length>=ListSize){
printf(" 表空间溢出,退出运行 ");
exit(0);
}
int i=0,j=0,k=0;
while (i<=L.length-1&&j<=Lb.length-1)
if (L.data[i]<=Lb.data[j])
{Lc->data[k]= L.data[i]; i++;k++;}
else {Lc->data[k]= Lb.data[j]; j++; k++;}
while (i<= L.length-1)
{ Lc->data[k]= L.data[i]; i++;k++;}
while (j<= Lb.length-1)
{Lc->data[k]= Lb.data[j]; j++; k++;}
Lc->length=L.length+ Lb.length;
}

运行输出结果:

 

标签:顺序,int,代码,C语言,length,void,printf,data,SeqList
From: https://blog.csdn.net/skhoole/article/details/137570889

相关文章

  • C语言单链表代码实现
    声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。设计算法,实现线性结构上的单链表的产生以及元素的查找、插入与删除,求表长、有序表插入、元素逆置、2个有序表合并等。#include<stdio.h>#include<stdlib.h>//单链表的定义:typedefintDataType......
  • AtomGit 代码托管平台评测赛——完整操作指南
    AtomGit优势功能:基于Git的代码管理平台,基础功能完整,并且有一套完整的对照文档,看到了一个新功能代码扫描,是个新鲜点。性能:整体测试,包括5G以内文件测试,都是以自身网速极限的状态完成,性能非常棒。易用性:与git操作无异,方便的是国内网络,配置完基本信息后操作特别顺畅。页面功能......
  • C语言笔记二的补充(实例应用)——猜数游戏的简单实现
    猜数字游戏要求:电脑自动生成1~100的随机数玩家猜数字,猜数字的过程中,根据猜测数据的大小给出反馈,直至才对,游戏结束。基础知识搭建:随机数的生成使用rand函数intrand(void);rand函数会返回一个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的大小是依赖编......
  • C语言笔记二——分支和循环(上)
    分支和循环1.if语句1.1if语句的语法形式如下:if(表达式)语句表达式成立(为真)语句执行;表达式不成立(为假)语句不执行。在C语言中,0为假,非0为真。//instance#include<stdio.h>intmain(){  intnum=0;  scanf("%d",&num);  if(num%2==1){   ......
  • 加入预测新数据,最小二乘支持向量机(lssvm)回归预测(多输入单输出)-附代码
    最小二乘支持向量机(lssvm)回归预测最小二乘支持向量机(LeastSquaresSupportVectorMachine,LS-SVM)是支持向量机(SupportVectorMachine,SVM)的一种变体,用于回归问题。其原理基本上与标准的支持向量机相似,但在损失函数和优化过程上有所不同。最小二乘支持向量机(LS-SVM)回归预......
  • C语言: 字符串函数(下)
    片头在上一篇中,我们介绍了字符串函数。在这一篇章中,我们将继续学习字符串函数,准备好了吗?开始咯!1.strncpy函数1.1strncpy函数的用法strncpy是C语言中的一个字符串处理函数,它用于将一个字符串的一部分内容复制到另一个字符串中。其函数原型为:char*strncpy(char*dest......
  • 用代码验证,esm 导出的是值的引用,commonjs导出的是值的拷贝
    首先需要学习一下esm和commonjs的区别,其中一条关于导出值我们可以手动验证一下,先记住结论esm导出的是值的引用commonjs导出的是值的拷贝没错我又遇到这个问题了,面试官先问我commonjs和esm有啥区别?然后问如果commonjs导出一个模块,在模块内部改变一个值,模块外部......
  • 用本小组项目中实际的例子来重现如下问题: 1、代码覆盖率对于“应该写但是没有写的代
    例子1-代码覆盖率无法检测资源管理问题:假设在移动充电桩应用中有一个负责与服务器通信的模块,它从服务器下载充电站的实时状态信息。开发者编写了一段代码来连接服务器、发送请求并接收响应数据,但是在处理完响应后,忘记关闭网络连接或释放相关资源:JavapublicclassChargingSta......
  • C语言分支和循环详解
    在程序中基础的三种结构为顺序结构,选择结构(分支结构),循环结构,几乎所有日常可见的事均可分为这三种结构或者这三种结构的组合.今天,我们就来详细了解一下关于C语言分支和循环语句.在正式介绍之前呢,先给大家提及一下C语言的控制语句:C语言共有9种控制语句,可以分为3类:......
  • Obsidian自定义代码块样式成Typora
    先来效果图修改前效果:修改后效果:编辑模式:预览模式:两种模式的表现间距略有不同,但不影响.添加自定义css样式.markdown-source-view.mod-cm6.cm-content>.HyperMD-codeblock{border-width:01px01px;border-style:solid;border-color:#E7EAE......