声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
设计算法,实现线性结构上的顺序表的产生以及元素的查找、插入与删除,删除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