「已注销」 2024-06-08 23:29 采纳率: 0%
浏览 8

编写一个函数实现增加一个新的线性表


#include "stdio.h"
#include "stdlib.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

typedef int status;
typedef int ElemType; //数据元素类型定义

#define LIST_INIT_SIZE 100
#define LISTINCREMENT  10
typedef int ElemType;
typedef struct{  //顺序表(顺序结构)的定义
          ElemType * elem;
          int length;
          int listsize;
}SqList;
typedef struct{  //线性表的管理表定义
     struct { char name[30];
               SqList L;    
      } elem[10];
      int length;
      int listsize;
 }LISTS;
status AddList(LISTS &Lists,char ListName[])
// 只需要在Lists中增加一个名称为ListName的空线性表,线性表数据又后台测试程序插入。
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    /********** End **********/
}

本关任务:编写一个函数实现增加一个新的线性表。
函数原型:status AddList(LISTS &Lists,char ListName[])
功能说明:Lists是一个以顺序表形式管理的线性表的集合,在集合中增加一个新的空线性表。增加成功返回OK,否则返回ERROR。

  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-06-08 23:29
    关注

    引自免费微信小程序:皆我百晓生

    为了实现AddList函数,你需要检查给定的名字是否已经存在于管理表中。如果名字不存在,就在管理表中为新的线性表分配空间,并初始化它。以下是完整的AddList函数实现:

    #include <string.h>
    
    status AddList(LISTS &Lists, char ListName[]) {
        // 检查列表名是否已存在
        for (int i = 0; i < Lists.length; ++i) {
            if (strcmp(Lists.elem[i].name, ListName) == 0) {
                return ERROR; // 名字已存在
            }
        }
    
        // 如果名字不存在,则添加新线性表
        if (Lists.length >= Lists.listsize) {
            // 扩容管理表
            LISTS temp;
            temp.length = Lists.length + LISTINCREMENT;
            temp.listsize = temp.length;
            strcpy(temp.elem[0], Lists.elem[0]);
            for (int i = 1; i < Lists.length; ++i) {
                strcpy(temp.elem[i], Lists.elem[i]);
            }
            free(Lists.elem);
            Lists.elem = malloc(sizeof(struct {char name[30]; SqList L; }) * temp.listsize);
            if (Lists.elem == NULL) {
                return OVERFLOW; // 内存分配失败
            }
            memcpy(Lists.elem, temp.elem, sizeof(struct {char name[30]; SqList L; }) * temp.length);
            Lists.listsize = temp.listsize;
        }
    
        // 初始化新的线性表
        Lists.elem[Lists.length].name[0] = '\0'; // 清空名字
        Lists.elem[Lists.length].L.elem = malloc(sizeof(ElemType) * LIST_INIT_SIZE);
        if (Lists.elem[Lists.length].L.elem == NULL) {
            return OVERFLOW; // 内存分配失败
        }
        Lists.elem[Lists.length].L.length = 0;
        Lists.elem[Lists.length].L.listsize = LIST_INIT_SIZE;
    
        // 复制名字到新的线性表
        strcpy(Lists.elem[Lists.length].name, ListName);
    
        ++Lists.length;
    
        return OK;
    }
    

    这个函数首先遍历现有的线性表,检查给定的名字是否已经存在。如果名字不存在,函数会检查管理表是否已满。如果满了,就会扩容管理表并复制现有内容。然后,它会在管理表末尾初始化一个新的空线性表,设置其名字为给定的名字,以及初始化线性表的内部结构。最后,增加管理表的长度,并返回OK表示操作成功。如果在任何阶段发生错误,如名字已存在、内存分配失败等,函数将返回ERROR。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月8日