⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 顺序表是线性表的一种最简单的存储结构。大家多多支持
💻 C
字号:
/*
 * 作者:     antigloss
 * 修改日期: 05-8-31 19:50
 * 欢迎光临 蚂蚁的C/C++标准编程
 * cpp.ga-la.com
 */

#include <stdio.h>
#include <stdlib.h>
#include "header/sqlist.h"
#include "header/funs.h"

#define MAX_LISTS 10    /* 最多可以建立的顺序表个数 */

/* 函数声明 */
char Menu( void );     /* 打印菜单,请用户选择 */
unsigned Choose( unsigned, unsigned, char ); /* 接收用户输入的选择 */

static int tmp; /* tmp 用于清空输入缓冲区 */
const char *msg[] = { "\n请问您要对哪个顺序表(%u — %u)进行操作:",
		              "\n请输入删除数目(%u — %u):",
		              "\n请输入字符串(原有数据会被覆盖):",
				      "\n请输入插入位置(%u — %u):",
				      "\n请输入删除位置(%u — %u):",
				      "\n此项操作至少要有两个顺序表才能进行。请再建立一个顺序表。",
				      "\n重复元素已被删除。",
				      "\n请问您要进行降序排序还是升序排序(%u 代表降序,%u 代表升序):",
				      "\n顺序表 %u %c 顺序表 %u",
				      "\n请输如互换点(%u — %u):",
	                  "\n排序完成。" };

int main( void )
{
	Sqlist L[ MAX_LISTS ];  /* 顺序表数组 */
	char choice;  /* 记录用户选择的操作 */
	unsigned short total_lists = 0; /* 用于记录目前一共有多少个顺序表 */
	char *init_msg[] = { "内存不足!创建失败。", /* 创建顺序表的提示信息 */
		                 "顺序表创建成功!您可以开始对顺序表进行操作了。" };

	printf( "\n请先创建一个顺序表。最多可以创建 %u 个顺序表。\n", MAX_LISTS );

	while ( choice = Menu() ) { /* 根据用户输入选择函数运行 */
		if ( !total_lists && choice != 1 ) {
			printf( "\n请先创建一个顺序表。最多可以创建 %u 个顺序表。\n", MAX_LISTS );
		} else {
			switch ( choice ) {
			case 1 :
				if ( total_lists == MAX_LISTS ) { /* 达到最大限制 */
					printf( "\n最多只能建立 %u 个顺序表。\n", MAX_LISTS );
				} else {
					int i = InitList( &L[total_lists] );
					total_lists += i; /* 更新顺序表数目 */
					printf( "\n%s\n", init_msg[i] );					
				}
				break;
			case 2 :
				{
					unsigned num = Choose( total_lists, 1, 0 );

					printf( "%s", msg[choice] );
					InputList(&L[num-1]);

					break;
				}
			case 3 :
				{
					unsigned num, pos;
					num = Choose( total_lists, 1, 0 );
					pos = Choose( L[num-1].length + 1, 1, choice );
					printf( "\n请输入字符串:" );
					/* 在第 num 个顺序表的第 pos 个元素处开始插入 */
					InsertList( &L[num-1], pos );

					break;
				}
			case 4 :
				{
					unsigned num, pos, size;
					num = Choose( total_lists, 1, 0 );
					if ( !L[num-1].length ) {
						printf( "\n顺序表为空,不能进行删除操作。\n" );
						break;
					}
					pos = Choose( L[num-1].length, 1, choice );
					size = Choose( L[num-1].length - pos + 1, 1, 1 );
					/* 从第 num 个顺序表的第 pos 个位置开始,删除 size 个元素 */
					DelList( &L[num-1], pos, size );

					break;
				}
			case 5 :
				{
					unsigned num1, num2;
					if ( total_lists < 2 ) {
						puts( msg[choice] );
						break;
					}
					num1 = Choose( total_lists, 1, 0 );
					num2 = Choose( total_lists, 1, 0 );
					if ( Union( &L[num1-1], &L[num2-1] ) ) {
						printf( "\n并集操作完成。操作结果保存于顺序表 %u 。\n", num1 );
					} else {
						printf( "\n并集操作失败。\n" );
					}

					break;
				}
			case 6 :
				{
					unsigned num = Choose( total_lists, 1, 0 );

					Purge( &L[num-1] );
					puts( msg[choice] );

					break;
				}
			case 7 :
				{
					unsigned num = Choose( total_lists, 1, 0 );
					unsigned ascend = Choose( 1, 0, choice );

					Bubble( &L[num - 1], ascend );
					puts( msg[10] );

					break;
				}
			case 8 :
				{
					unsigned num1, num2;
					int flag;

					if ( total_lists < 2 ) {
						puts( msg[5] );
						break;
					}
					num1 = Choose( total_lists, 1, 0 );
					num2 = Choose( total_lists, 1, 0 );
					flag = Compare( &L[num1-1], &L[num2-1] );
					if ( !flag ) {
						flag = '=';
					} else if ( flag > 0 ) {
						flag = '>';
					} else {
						flag = '<';
					}
					printf( msg[choice], num1, flag, num2 );

					break;
				}
			case 9 :
				{
					unsigned num = Choose( total_lists, 1, 0 ), point;
					if ( L[num-1].length < 2 ) {
						puts("\n元素太少,不能进行互换。");
						break;
					}
					point = Choose( L[num-1].length - 1, 1, choice );
					Exchange( &L[num-1], point );
					puts( "\n互换完成。" );

					break;
				}
			case 10 :
				{
					unsigned num = Choose( total_lists, 1, 0 );

					Purge2( &L[num-1] );
					puts( msg[6] );

					break;
				}
				break;
			default:
				break;
			}
		}

		/* 打印顺序表的内容 */
		Disp( L, total_lists );
	}

	while ( total_lists ) {
		free( L[ --total_lists ].elem ); /* 释放内存 */
	}

	puts( "\n感谢您使用我们的产品!请按回车退出..." );
	getchar();
	return 0;     /* 退出程序 */
} /* end of main */

/* begin of Choose 05-8-13 3:00 */
unsigned Choose( unsigned up, unsigned low, char c )
{
	unsigned num = 0;
	do {
		printf( msg[c], low, up );
		scanf( "%u", &num );
		flush_stdin(); /* 清空输入缓冲区 */
	} while ( num > up || num < low );

	return num;
} /* end of Choose */

/* begin of Menu 05-8-12 23:20 */
char Menu( void ) /* 打印菜单,并且接受用户输入 */
{
	int ch = -1;    /* ch 用于接收用户输入 */

	for (;;) {
		printf( "\n********************************\n"
		        "* 1. 创建顺序表                *\n"
				"* 2. 输入数据                  *\n"
		        "* 3. 插入数据                  *\n"
		        "* 4. 删除数据                  *\n"
		        "* 5. 求顺序表并集              *\n"
		        "* 6. 删除重复元素              *\n"
		        "* 7. 冒泡排序                  *\n"
		        "* 8. 比较顺序表大小            *\n"
		        "* 9. 前N个元素和后M个元素互换  *\n"
		        "*10. 删除重复元素(2)           *\n"
		        "* 0. 退出                      *\n"
		        "********************************\n\n"
				"请输入您要执行的操作(按回车确定):");

		scanf( "%d", &ch );
		flush_stdin(); /* 清空输入缓冲区 */
		
		if ( ch < 11 && ch > -1 ) {
			break; /* 输入合法,退出循环 */
		}
		/* 非法输入,请用户重新输入 */
		puts("\n请输入 0 到 10 之间的数字。\n");
	} /* end of for */

	return ch; /* 返回操作号 */
} /* end of Menu */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -