C数据结构顺序表与基本操作

顺序表顺序表,全名顺序存储结构,是线性表的一种。,线性表用于存储逻辑关系为“一对一”的数据。

本代码涉及顺序表的建立,输出,查找元素,删除,合并两个顺序表(保持有序)

运行展示:

代码:

#define MAXSIZE 100     		//MAXSIZE为线性表可能的最大长度
#include<stdio.h>

typedef int ElemType;
typedef struct
{
    ElemType data[MAXSIZE];
    int length;					// length为线性表的长度
}SqList;
						//线性表定义
void InitList(SqList *L)			//初始化操作,将线性表L置空
{
    L->length=-1;
}

void CreatSqlist(SqList *L,int n)//建立顺序表
{
int i;
for(i=0;i<n;i++)               //根据给的数多少来确定表长,并输入
{
   printf("请输入第 %d 个数", i);
   scanf("%d", &L->data[i]);
   L->length=n-1;
}
}

void Output(SqList *L)				//输出顺序表L
{
    int i;
    for (i=0;i<=L->length;i++)
        printf("%5d",L->data[i]);		//每个数据占5列
    printf("\n");
}

int IsEmpty(SqList *L)  //判断表是否为空,如L是空表,返回1,否则返回0
{
	return 0;
}

int GetElem(SqList *L,int i) //取表中第i元素
{ int j;
if(i>L->length)
    printf("无该元素");
 else
    j=L->data[i];
  return j;
}

int LocateElem(SqList *L,ElemType x)//定位函数,返回L中第1个与x相等的数据元素的位置(从0算起),否则返回值为0
{
	int i;
	for(i=0;L->data[i]!=x&&1<=L->length; i++);
	{if(i>L->length)
	return -1;
	else
	return i;}

}
int Insert(SqList *L,ElemType x,int i)//在线性表L中第i个数据元素之前插入一个数据元素x
{
	int k;
	if(i<0||i>L->length+1||L->length==MAXSIZE-1)     //插入位置不能大于表长
	return 0;
	else
	for(k=L->length;k>=i;k--)      //依次把数据后移,再找到对应位置放入数据
    {
    	L->data[k+1]=L->data[k];}
    	L->data[i]=x;
		L->length++;
		return 1;

}

int Delete(SqList *L, int i)		//删除线性表L中第i个数据元素
{ int k;
if(i<0||i>L->length)           //判删除位置无误
	return 0;
	for(k=i;k<L->length;k++)   //循环将后面值往前覆盖
	{
		L->data[k]=L->data[k+1];
		L->length--;
		return 1;
	}
}

void Clear(SqList *L)			//置空线性表L
{

}

void MergeList(SqList *La,SqList *Lb,SqList *Lc)//合并有序表La和Lb到表Lc中,使得表Lc依然有序
{
  int i,j,k;            //定义三个变量分别来遍历a b 和新表c
  i=0,j=0,k=0;
  while(i<=La->length&&j<=Lb->length) //如果a表b表有一个不为空则循环继续
    if(La->data[i]<Lb->data[j])
  {
      Lc->data[k]=La->data[i];
      k++;
      i++;
  }
else{
    Lc->data[k]=Lb->data[j];
    k++;
    j++;
}
while(i<=La->length)
  {
      Lc->data[k]=La->data[i];
      k++;
      i++;
  }

while(j<=Lb->length){
    Lc->data[k]=Lb->data[j];
    k++;
    j++;
}
  Lc->length=k-1;
}

void Output1 ( )
{
    int i;
    for (i=0;i<10;i++)
        printf("  ");
    for (i=0; i< 32; i++)
        printf("*");
    printf("\n");
}
void main1()
{
    int i;
    Output1();
    for (i=0; i< 10; i++)printf("  ");
    printf("*     ");
    printf("1.建立一个顺序表          *");
    for (i=0; i< 10; i++) printf("  ");
    printf("\n");
    for (i=0; i< 10; i++)printf("  ");
    printf("*     ");
    printf("2.输出一个顺序表          *");
    for (i=0; i< 10; i++) printf("  ");
    printf("\n");
    for (i=0; i< 10; i++)printf("  ");
    printf("*     ");
    printf("3.在顺序表中查找          *");
    for (i=0; i< 10; i++) printf("  ");
    printf("\n");
    for (i=0; i< 10; i++)printf("  ");
    printf("*     ");
    printf("4.向顺序表插入一个元素");
    for (i=0; i< 2; i++) printf("  ");
    printf("*");
    printf("\n");
    for (i=0; i< 10; i++)printf("  ");
    printf("*     ");
    printf("5.删除顺序表的一个元素");
    for (i=0; i< 2; i++) printf("  ");
    printf("*");
    printf("\n");
    for (i=0; i< 10; i++)printf("  ");
    printf("*     ");
    printf("6.读取顺序表中的元素");
    for (i=0; i< 3; i++) printf("  ");
    printf("*");
    printf("\n");
    for (i=0; i< 10; i++)printf("  ");
    printf("*     ");
    printf("7.合并顺序表");
    for (i=0; i< 7; i++) printf("  ");
    printf("*");
    printf("\n");
    for (i=0; i< 10; i++)printf("  ");
    printf("*     ");
    printf("0.退          出          *");
    for (i=0; i< 8; i++) printf("  ");
    printf("\n");
    Output1();
}

void main()					//主函数
{
    int n, i, k=1, m, x;    //定义相关字符
    SqList L,La,Lc;         //顺序表引用
    InitList (&L);          //链表引用
    main1();                //跳转展示菜单
    while (k)               //循环选择
    {
        printf("请选择0--- 7:       ");
        scanf ("%d", &m);
        getchar();
        switch (m)
        {
        case 0:
            return;
        case 1:
        {
            printf ("构建顺序表:\n");
            printf("请输人顺序表元素的个数:");
            scanf ("%d", &n);
            CreatSqlist(&L,n);				//建立长度为n的顺序表L
            Output(&L);					//输出表L
            break;
        }
        case 2:
            Output(&L);
            printf("\n");
            break;
        case 3:
        {
            printf("请输入要查找的元素值: ");
            scanf ("%d", &x);
            k= LocateElem(&L,x);               //调用查找函数
            printf ("要查找的元素的定位:%d\n", k );
            printf("\n");
            break;
        }
        case 4:
        {
            printf ("输入要插入元素的位置和值: " );
            fflush(stdin);                   //清理当前缓存
            scanf ("%d",&i);                 //记录插入函数值
            scanf ("%d",&x);                 //记录插入位置
            Insert (&L, x,i);                //调用插入函数
            Output(&L);                      //输出
            printf("\n");
            break;
        }
        case 5:
        {
            printf ("输入要删除元素的位置: ");
            fflush(stdin);
            scanf ("%d",&i);
            Delete(&L,i);                    //调用删除函数
            Output(&L);
            break;
        }
        case 6:
        {
            printf ("请输入要取出的元素的序号: ");
            fflush(stdin);
            scanf ("%d",&i);
            k=GetElem(&L,i);				//取表中第i个元素
            printf("取出的第%d个元素为:%d\n", i, k) ;
            break;
        }
        case 7:
        {
            InitList(&La);
            printf ("请输入第2个顺序表元素的个数: ");
            scanf ("%d", &m);
            CreatSqlist(&La,m);			//建立长度为m的顺序表L
            Output(&La);					//输出表La
            MergeList(&L,&La,&Lc);
            printf ("输出合并后的顺序表中的元素:\n");
            Output(&Lc);					//输出表Lc
            break;
        }
        default:
            return;
        }
        printf("继续运行吗Y /N:");
        fflush(stdin);
        scanf("%c",&k);
        if (k=='n'||k=='N') return;
        fflush(stdin);
        main1();
    }

}

如若全部读懂,对于初学者来说收益颇丰。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值