C语言顺序表代码实现

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

设计算法,实现线性结构上的顺序表的产生以及元素的查找、插入与删除,删除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;
}

运行输出结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值