数据结构实验一 顺序表的操作

实验内容:

编写一个完整的程序,实现顺序表的生成、插入、删除、输出等基本运算。
(1) 建立一个顺序表,含有 n 个数据元素。
(2) 输出顺序表。
(3) 在顺序表中删除值为 x 的结点或者删除给定位置 i 的结点。
(4) 实现把该表中所有奇数排在偶数之前,即表的前面为奇数,后面为偶数。
(5) *输入整型元素序列,利用有序表插入算法建立一个有序表。
(6)*利用算法 5 建立两个非递减有序表 A 和 B,并把它们合并成一个非递减有序表 C。
(7) 在主函数中设计一个简单的菜单,分别测试上述算法。

代码如下:

DS.h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;

SqList.h

#ifndef SQLIST_H_INCLUDED
#define SQLIST_H_INCLUDED
#include "DS.h"
typedef int ElemType;
typedef struct
{
 ElemType *elem;
 int length;
 int listsize;
}SqList;
void menu();
Status InitList_Sq(SqList &L, int n);/*初始化顺序表*/
Status CreateList_Sq(SqList &L);/*建立顺序表*/
void PrintList_Sq(SqList L);/*输出顺序表*/
Status DeleteList_Sq(SqList &L,int i,ElemType &e);/*删除第 i 个元素*/
Status DeleteListX_Sq(SqList &L,ElemType x);/*删除值为 x 的元素*/
Status AdjustList_Sq(SqList &L);/*奇数排在偶数之前*/
Status OrderList_sq(SqList &L, int n);/*插入法生成递增有序表*/
void MergeList_Sq(SqList La, SqList Lb, SqList &Lc );/*两个非递减有序表 A 和 B,并把它们合并成一
个非递减有序表 C*/
#endif // SQLIST_H_INCLUDED

SqList.cpp

#include "SqList.h"
void menu()
{
 printf("\t\t\t 顺序表基本操作\n\n");
 printf("\t\t\t1.建 立 顺 序 表\n");
 printf("\t\t\t2.遍 历 顺 序 表\n");
 printf("\t\t\t3.删 除 第 i 个 元 素\n");
 printf("\t\t\t4.删 除 值 为 x 的 元 素\n");
 printf("\t\t\t5.奇 数 排 在 偶 数 之 前\n");
 printf("\t\t\t6.插 入 法 生 成 递 增 有 序 表\n");
 printf("\t\t\t7.两个非递减有序表 La 和 Lb 合并成非递减有序表 Lc\n");
 printf("\t\t\t0.退 出\n\n");
}
/*初始化顺序表*/
Status InitList_Sq(SqList &L, int n)
{
 L.elem=(ElemType*)malloc(n*sizeof(ElemType));
 if(!L.elem) exit(OVERFLOW);
 L.length=0;
 L.listsize=n;
 return OK;
}
/*建立顺序表*/
Status CreateList_Sq(SqList &L)
{ 
 int n, i;
 printf("请输入顺序表长度:");
 scanf("%d", &n);
 if(InitList_Sq(L, n))
 {
 printf("请输入%d 个元素:", n);
 for(i = 0; i < n; i++)
 {
 scanf("%d", &L.elem[i]);
 L.length++;
 }
 return OK;
 }
 else
 return ERROR;
}
/*输出顺序表*/
void PrintList_Sq(SqList L)
{
 int i;
 printf("顺序表中元素为:\n");
 for(i = 0; i < L.length; i++)
 {
 printf("%d ", L.elem[i]);
 }
 printf("\n");
}
/*删除第 i 个元素*/
Status DeleteList_Sq(SqList &L,int i,ElemType &e)
{
ElemType *p, *q;
if( (i<1) || (i>L.length) ) return ERROR;
p = &(L.elem[i-1]);
e = *p;
 q = L.elem+L.length-1;
for(++p; p <= q; ++p) *(p-1) = *p;
--L.length;
return OK;
}
/*删除值为 x 的元素,删除成功返回 OK,删除失败返回 ERROR*/
Status DeleteListX_Sq(SqList &L,ElemType x)
{
	ElemType *p, *q;
	p = L.elem; q = L.elem + L.length - 1;
	for( ; p <= q; p++)
	{
		if(*p == x)
		{
			for( ; p < q; p++)
				*p = *(p+1);
			L.length--;
			return OK;
		}
	}
 
	return ERROR;
}
/*奇数排在偶数之前*/
Status AdjustList_Sq(SqList &L)
{
 ElemType *p, *q,*o;
 int temp;
 p = L.elem; q = L.elem + L.length;
 for(;p<q-1;p++){
 	for(o=p+1;o<q;o++){
 		if(*p%2==0&&*o%2!=0){
 			temp=*o;
 			*o=*p;
 			*p=temp;
		 }
	 }
 }
 return OK;
}
/*插入法生成递增有序表,有序表生成成功返回 OK,失败返回 ERROR*/
Status OrderList_sq(SqList &L, int n)
{
 	L.elem = (ElemType*)malloc(n * sizeof(ElemType));
	L.length = 0;
    int i, j, k, x;  /*x表示每次待插入的元素*/
	for(i = 0; i < n; i++)
	{
		scanf("%d", &x);
		ElemType *p, len = L.length; p = L.elem;
		for(j = 0; j < len; j++)
		{
			if(x > p[j]) continue;
			for(k = len; k > j; k--)
			{
				p[k] = p[k-1];
			}
			p[j] = x;
			break;
		}
		if(j >= len) p[len] = x;
		L.length++;
	}
	return OK;
}
/*两个非递减有序表 A 和 B,并把它们合并成一个非递减有序表 C*/
void MergeList_Sq(SqList La, SqList Lb, SqList &Lc )
{
 ElemType *pa, *pb, *pc, *pa_last, *pb_last;
 pa = La.elem; pb = Lb.elem;
 Lc.listsize = Lc.length = La.length+Lb.length;
 pc = Lc.elem = (ElemType *)malloc(Lc.listsize * sizeof(ElemType));
 if (!Lc.elem) exit (OVERFLOW);
 pa_last = La.elem + La.length - 1;
 pb_last = Lb.elem + Lb.length - 1;
 while (pa <= pa_last && pb <= pb_last)
 {
 if (*pa <= *pb) *pc++ = *pa++;
 else *pc++ = *pb++;
 }
 while(pa <= pa_last) *pc++ = *pa++;
 while(pb <= pb_last) *pc++ = *pb++;
}

main.cpp

#include "SqList.h"
int main()
{
 int choice, n, i, x;
 SqList L, La, Lb, Lc;
 while(1)
 {
 menu();
 printf("选择你的操作:");
 scanf("%d",&choice);
 switch(choice)
 {
 case 1:
 if(CreateList_Sq(L))
 printf("顺序表创建成功\n");
 else
 printf("顺序表创建失败\n");
 break;
 case 2:
 PrintList_Sq(L);
 break;
 case 3:
 printf("请输入删除元素的位置:");
 scanf("%d", &i);
 if(DeleteList_Sq(L, i, x))
 printf("被删除元素值为:%d\n",x);
 else
 printf("删除失败\n");
 break;
 case 4:
 printf("请输入删除元素值:");
 scanf("%d", &x);
 if(DeleteListX_Sq(L, x))
 printf("删除成功\n");
 else
 printf("删除失败\n");
 PrintList_Sq(L);
 break;
 case 5:
 AdjustList_Sq(L);
 printf("新链表为:\n");
 PrintList_Sq(L);
 break;
 case 6:
 printf("请输入顺序表长度:");
 scanf("%d", &n);
 if(OrderList_sq(L, n))
 {
 printf("值有序顺序表为:\n");
 PrintList_Sq(L);
 }
 else
 printf("顺序表创建失败\n");
 break;
 case 7:
 printf("请输入顺序表 La 的长度:");
 scanf("%d", &n);
 OrderList_sq(La, n);
 printf("请输入顺序表 Lb 的长度:");
 scanf("%d", &n);
 OrderList_sq(Lb, n);
 MergeList_Sq(La, Lb, Lc);
 printf("合并后的顺序表为:\n");
 PrintList_Sq(Lc);
 break;
 case 0:
 return 0;
 default:
 printf("输入错误,请重新输入\n");
 }
 } }

显示结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值