0916 - 线性表

两杯奶茶

#include<stdio.h>
#include<malloc.h>
#include<stdbool.h>
#define rep(i, aa, bb) for(i = aa; i <= bb; i ++)
#define per(i, aaa, bbb) for(i = aaa; i >= bbb; i --)

const int maxn = 1e6 + 10;
using namespace std;
int n, i, j;

typedef struct {
    int *arr;
    int length;
}SqList;

int InitList_Sq(SqList * l)
{
    printf("请输入你要构造数组的长度:");
    scanf("%d", &n);
    l->arr = (int * ) malloc (maxn * sizeof(int));
    if(!l->arr){
        printf("数组开辟失败/n");
        return -1;
    }
    l->length = n;
    return 1;
}

void ScannerList_Sq(SqList * l)
{
	printf("数组长度为%d,请输入数组元素:", n);
    rep(i, 1, n){
    	scanf("%d", &l -> arr[i]);
    }
}

void QuickSort_Sq(int l, int r, SqList * lis)
{
    if(l >= r) return;
    int i = l - 1, j = r + 1;
    int x = lis -> arr[l + r >> 1];
    while(i < j){
        do i ++; while(lis -> arr[i] < x);
        do j --; while(lis -> arr[j] > x);
        if(i < j) {
        	int tm;
        	tm = lis -> arr[i];
        	lis -> arr[i] = lis -> arr[j];
        	lis -> arr[j] = tm;
		}
    }
    QuickSort_Sq(l, j, lis);
    QuickSort_Sq(j + 1, r, lis);
}

int FindList_Sq(SqList * l)
{
    printf("请输入要查询的元素的位置:");
    int pos;
    scanf("%d", &pos);
    if(pos < 1 || pos > l -> length){
    	printf("元素不存在\n");
        return -1;
    } else{
        printf("该元素为:%d\n",l -> arr[pos]);
    }
    return 1;
}

int Delete_Sq(SqList * l)
{
    printf("请输入要删除的元素:");
    int tmp;
    scanf("%d", &tmp);
    bool f1 = false;
    rep(i, 1, l -> length){
        if(tmp == l -> arr[i]){
            f1 = true;
            rep(j, i, l -> length - 1){
                l -> arr[j] = l -> arr[j + 1];
            }
            l -> length --;
            i --;
        }
    }
    if(!f1){
        return -1;
    } else {
        rep(i, 1, l -> length){
        	printf("%d ", l -> arr[i]);
        }
        printf("\n");
        return 1;
    }
}

int Insert_Sq(SqList * l)
{
    printf("请输入要插入元素的数值和位置");
	int pos, val;
	scanf("%d%d", &val, &pos);
	if(pos <= 0 || pos > l -> length + 2){
        return -1;
	}
	l -> length ++;
	l -> arr[l -> length] = 0;
	per(i, l -> length, pos){
        l -> arr[i + 1] = l -> arr[i];
	}
	l -> arr[pos] = val;
	rep(i, 1, l -> length){
        printf("%d ", l -> arr[i]);
	}
	printf("\n");
}

void InsertNewNode_Sq(SqList * l)
{
	printf("请输入你要插入数组的元素数量:");
	int newn;
	scanf("%d", &newn);
	printf("请输入数组元素:"); 
	rep(i, 1, newn){
		int num;
		scanf("%d", &num);
		l -> arr[++l -> length] = num;
//		l -> length ++;
	}
	printf("\n");
	QuickSort_Sq(1, l -> length, l);
	rep(i, 1, l -> length){
		printf("%d ", l -> arr[i]);
	}
	printf("\n");
}

int TotalLength_Sq(SqList * l)
{
	return l -> length;
}
int main()
{
    bool f = true;
    int op;
    SqList L;
    while(f){
        printf("操作菜单如下:\n");
        printf("0:对数组初始化\n");
        printf("1: 输入一个数组\n");
        printf("2: 对数组进行排序\n");
        printf("3: 查询数组某一位置元素\n");
        printf("4: 删除数组中某一元素\n");
        printf("5: 插入一个元素在指定位置\n");
        printf("6: 销毁这个数组\n");
        printf("7:插入一个数组并把它们按顺序排好\n");
        printf("8: 查询数组长度\n");
        printf("9: 结束程序\n");
        printf("请输入你的操作:");
        scanf("%d", &op);
        if(op == 0) {
			int k = InitList_Sq(& L);
			if(k == -1){
				printf("数组初始化失败\n");
			} else {
				printf("赋值成功\n");
			}
		} else if(op == 2) {
			QuickSort_Sq(1, n, & L);
			rep(i, 1, n){
				printf("%d ", L.arr[i]);
			}
			printf("\n");
		} else if(op == 3) {
			int k = FindList_Sq(& L);
			if(k == -1){
				printf("查询位置不合法\n");
			}
		} else if(op == 4) {
			int k = Delete_Sq(& L);
			if(k == -1){
				printf("删除元素不存在\n");
			}
		} else if(op == 5) {
			int k = Insert_Sq(& L);
			if(k == -1){
                printf("插入元素不合法\n");
			}
		} else if(op == 6) {
			free(L.arr);
		} else if(op == 1) {
			ScannerList_Sq(& L);
		} else if(op == 7) {
			InsertNewNode_Sq(& L);
		} else if(op == 8) {
			int k = TotalLength_Sq(& L); 
			printf("该数组长度为:%d\n", k);
    	} else {
    		return 0;
		}
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值