线性表的顺序表示和实现

||=== 构建: Debug 在 链表 中 (编译器: GNU GCC Compiler) ===|
C:\Users\张成龙\Desktop\code\链表\main.cpp||In function 'int main()':|
C:\Users\张成龙\Desktop\code\链表\main.cpp|137|error: jump to case label [-fpermissive]|
C:\Users\张成龙\Desktop\code\链表\main.cpp|131|error:   crosses initialization of 'int k'|
||=== 构建 失败: 2 error(s), 0 warning(s) (0 分, 0 秒) ===|
 

出现这样的编译错误原因是在case中定义变量,编译器认为这会跳过变量的初始化。解决办法将case中定义的变量用{}括起来,

或者 定义在switch外。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int MAXN = 1000 + 7;

typedef struct {
    int num;        // 编号
    char name[50];  // 书名
    double price;   // 价格
} BOOK;
typedef struct {
    BOOK *elem;     // 定义BOOK 类型指针
    int length;
} SqList;
bool operator == (BOOK e1, BOOK e2)        // 重载等于等于号,判断两个结构体变量是否相等
{
    if(e1.num == e2.num && strcmp(e1.name, e2.name) == 0 && e1.price == e2.price)
        return true;
    return false;
}

bool InitList(SqList &L)    // 返回值是该函数的执行状态,下同
{
    L.elem = new BOOK[MAXN];    // 动态分配一个数组
    if( !L.elem)
       exit(0);
    L.length = 0;   // 初始长度为0
    return true;
}
bool GetElem(SqList &L, int i, BOOK &e)
{
    if(i < 1 || i > L.length)	// 查询位置不合法
        return false;
    e = L.elem[i-1];
    return true;
}
int FindElem(SqList &L, BOOK e)     // 查询到返回其下标,否则为-1
{
    for(int i=0; i<L.length; i++)
        //if(L.elem[i].num == e.num  && L.elem[i].name == e.name && L.elem[i].price == e.price)
        if(L.elem[i] == e)	// 用到了== 的重载,否则需要上一行的写法
            return i;
    return -1;	// 没找到返回-1
}
bool InsertList(SqList &L, int i, BOOK e)
{
    if(i < 1 || i > L.length + 1)   // 插入位置不合法
        return false;
    if(L.length == MAXN)    // 元素已满
        return false;
    for(int j = L.length - 1; j >= i-1; j--)    // 第i个元素及其以后的元素全部后移一位
        L.elem[j+1] = L.elem[j];
    L.elem[i-1] = e;       // 插入
    L.length ++;           // 插入元素后长度加一
    return true;
}
bool DeleteList(SqList &L, int i)	// 删除第i个,实际存储为 i-1,因为从0开始
{
    if(i < 1 || i > L.length)
        return false;
    for(int j=i-1; j<L.length-1; j++)
        L.elem[j] = L.elem[j+1];
    L.length --;    // 删除元素后长度减一
    return true;
}
bool PrintList(const SqList &L)
{
    for(int i=0; i<L.length; i++)
    {
        cout << L.elem[i].num << " ";
        cout << L.elem[i].name << " ";
        cout << L.elem[i].price << endl;
    }
    return true;
}

int main()
{
    SqList L;
    InitList(L);
    cout << "input n: " << endl;
    int n;
    BOOK e;
    cin >> n;
    cout << "输入初始化的n个元素" << endl;
    for(int i=0; i<n; i++)
    {
        cin >> e.num;
        cin >> e.name;
        cin >> e.price;
        if( !InsertList(L, i+1, e))
        {
            printf("Insert Error");
            break;
        }
    }

	int choice;
	printf(" 1: Insert\n 2: Delete\n 3: Get\n 4: Find\n 5: Print\n");
	while(cin >> choice)
	{
		int index;
		int k;
		switch(choice)
		{
			case 1:
				printf("input e\n");
				cin >> e.num;
				cin >> e.name;
				cin >> e.price;
				printf("input Insert index: ");
				cin >> index;
				InsertList(L, index, e);
				break;
			case 2:
				printf("input Delete index: ");
				cin >> index;
				DeleteList(L, index);
				break;
			case 3:
				printf("input Get index: ");
				cin >> index;
				GetElem(L, index, e);
				printf("%d %s %.2lf\n", e.num, e.name, e.price);
				break;
			case 4:
				printf("input e\n");
				cin >> e.num;
				cin >> e.name;
				cin >> e.price;
				k = FindElem(L, e);
				if(k != -1)
					printf("%d %s %.2lf\n", L.elem[k].num, L.elem[k].name, L.elem[k].price);
				else
					printf("Find Error\n");
				break;
			case 5:
				PrintList(L);
				break;
		}
	}


    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值