数据结构题及c语言版答案第二章的,数据结构第二章作业及答案.ppt

数据结构第二章作业及答案.ppt

1 数据结构第二章作业及答案一 选择题1 下述哪一条是顺序存储结构的优点 A 存储密度大B 插入运算方便C 删除运算方便D 可方便地用于各种逻辑结构的存储表示2 下面关于线性表的叙述中 错误的是哪一个 A 线性表采用顺序存储 必须占用一片连续的存储单元 B 线性表采用顺序存储 便于进行插入和删除操作 C 线性表采用链接存储 不必占用一片连续的存储单元 D 线性表采用链接存储 便于插入和删除操作 3 线性表是具有n个 的有限序列 n 0 A 表元素B 字符C 数据元素D 数据项4 若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算 则利用 存储方式最节省时间 A 顺序表B 双向链表C 带头结点的双向循环链表D 循环链表 2 5 利用双向链表作线性表的存储结构的优点是什么 便于进行插入和删除的操作B 提高按关系查找数据元素的速度C 节省空间D 便于销毁结构释放空间6 链表不具有的特点是 A 插入 删除不需要移动元素B 不必事先估计存储空间C 可随机访问任一元素D 所需空间与线性长度成正比7 非空的循环链表head的尾结点指针p满足 A p headB p next NILLC p NILLD p next head8 对于一个头指针为head的带头结点的线性链表 判定该表为空表的条件是 A head NULLB head NULLC head next headD head next NULL 3 9 设线性链表中结点的结构为 data next 已知指针q所指结点是指针p所指结点的直接前驱 若在 q与 p之间插入结点 s 则应执行下列哪一个操作 s next p next p next s B q next s s next p p next s next s next p p next s s next q 10 在线性链表指针为p的结点之后插入指针为s的结点 正确的操作是 A p next s s next p next B s next p next p next s C p next s p next s next D p next s next p next s 请将选择题答案写在下面括号内 1 2 3 4 5 6 7 8 9 10 4 二 顺序表和线性链表的特点分别是什么 三 请写出顺序表的类型定义SqList 解释各变量和常量的含义 并给出初始化操作 插入操作和删除操作的算法的类C语言描述 其中插入和删除操作还要求给出算法操作步骤的文字描述 1 StatusInitList Sq SqList L 2 StatusListInsert Sq SqList L inti ElemTypee 3 ListDelete Sq SqList L inti ElemType e 四 请写出线性链表的结点类型定义LNode及指向结点的指针类型定义LinkList 并给出逆序创建带头结点的单链表的算法操作步骤的文字描述及算法的类C语言描述 voidCreateList L LinkListL intn 5 五 在双向链表中 在ai之前插入一结点 画出指针的变化 并写出指针变化的主干语句 六 已知q为z所在结点的指针 删除y所在结点 画出指针的变化 并写出指针变化的主干语句 6 第二章作业解答 一 1 A 2 B 3 C 4 A 5 B 6 C 7 D 8 D 9 B 10 B 二 顺序表的特点 1 通过元素的存储顺序反映线性表中数据元素之间的逻辑关系 2 可随机存取顺序表的元素 3 顺序表的插入 删除操作要通过移动元素实现 线性链表的特点 1 通过保存直接后继元素的存储位置来表示数据元素之间的逻辑关系 2 插入删除操作通过修改结点的指针实现 3 不能随机存取元素 7 解答 续 三 解 顺序表的类型定义 defineLIST INIT SIZE100 线性表存储空间的初始分配量 defineLISTINCREMENT10 线性表存储空间的分配增量typedefstruct ElemType elem 线性表存储空间基址intlength 当前线性表长度intlistsize 当前分配的线性表存储空间大小 以sizeof ElemType 为单位 SqList 其中 SqList 类型名 SqList类型的变量是结构变量 它的三个域分别是 elem 存放线性表元素的一维数组基址 其存储空间在初始化操作 建空表 时动态分配 length 存放线性表的表长 listsize 用于存放当前分配 存放线性表元素 的存储空间的大小 8 解答 续 1 初始化操作算法 算法2 3 StatusInitList Sq SqList InitList Sq 9 解答 续 2 插入操作基本步骤 1 若i不合法或表L已满 算法结束并返回ERROR 否则转2 2 将第i个元素及之后的所有元素均后移一个位置3 将新元素写入空出的位置 4 表长 1 10 解答 续 插入操作算法 算法2 4 StatusListInsert Sq SqList ListInsert Sq 11 解答 续 3 删除算法的主要步骤 1 若i不合法或表L空 算法结束 并返回ERROR 否则转2 2 将第i个元素赋值给e 3 将第i个元素之后的元素 不包括第i个元素 依次向前移动一个位置 4 表长 1 12 解答 续 删除操作算法 算法2 5 StatusListDelete Sq SqList ListDelete Sq 13 解答 续 四 线性链表的结点类型定义及指向结点的指针类型定义typedefstructLNode ElemTypedata structLNode next LNode LinkList 逆序创建带头结点的单链表的算法操作如下 1 建立一个 空表 2 输入数据元素an 建立结点并插入 3 输入数据元素an 1 建立结点并插入 4 依次类推 直至输入a1为止 14 解答 续 逆序创建带头结点的单链表的算法的类C语言描述如下 voidCreateList L LinkListL intn 逆序输入n个数据元素 建立带头结点的单链表L LinkList malloc sizeof LNode L next NULL 先建立一个带头结点的单链表for i n i 0 i p LinkList malloc sizeof LNode scanf 插入 CreateList L 15 解答 续 五 解 此处图略 1 s prior q prior 2 q prior next s 3 s next q 4 q prior s 六 解 此处图略 1 p q prior 2 p prior next q 3 q prior p prior 4 free p

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 顺序存储结构中数据中数据元素之间逻辑关系是由( )表示的,链接存储结构中的数据元素之间的逻辑关系是由( )表示的。 A.线性结构 B.非线性结构 C.存储位置 D.指针 2. 线性表是( )。 A.一个有限序列,可以为空 B. 一个有限序列,不能为空 C. 一个无限序列,可以为空 D. 一个无限序列,不能为空 3. 已知一维数组A采用顺序存储结构,每个元素占用4个存储单元,第9个元素的地址为144,则第一个元素的地址是( )。 A. 108 B. 180 C. 176 D. 112 4. 在单链表中删除指针p所指结点的后继结点,则执行( )。 A. p->next= p->next->next B. p->next= p->next C. p= p->next->next D. p= p->next; p->next= p->next->next 5. 若某链表最常用的操作是在最后一个结点之后插入一个结点删除最后一个结点,则采用( )存储方式最节省时间。 A. 单链表 B. 双链表 C. 带头结点的双循环链表 D. 单循环链表 6.二维数组A[7][8]以列序为主序的存储, 计算数组元素A[5][3] 的一维存储空间下标 k=( )。 A. 38 B. 43 C. 26 D. 29 二、完成下列填空题(每空3分,共9分)。 1.在顺序表L中第i个位置上插入一个新的元素e: Status ListInsert_Sq(SqList &L , int i , ET e){ if ( iL.length+1) return ERROR; if(L.length >= L.listsize){ p=(ET*)realloc(L.elem,(L.listsize+10)*sizeof(ET)); if (p==NULL) exit(OVERFLOW); L.elem=p; } for( j=L.length ; j>=i ; --j ) L.elem[j]=L.elem[j-1] ; L.elem[j]=e ; ++L.length ; return OK; } 2. 删除双向链表中p所指向的节点算法: status delete(DuLinkList L, DuLinkList p) { if (p= =L) return ERROR; else { p->prior->next=p->next; p->next->prior=p->prior ; } free(p); return OK; } 三、编程题(共27分)。 1. (共12分)用顺序表表示集合,设计算法实现集合的求差集运算,要求不另外开辟空间。 顺序表的存储结构定义如下: #define Maxsize 100 typedef struct { ElemType data[MaxSize]; // ElemType表示不确定的数据类型 int length; // length表示线性表的长度 }SqList; 将如下函数,伪码补充完整(8分),代码前先用文字描述自己的算法思想(4分)。 文字描述算法:略(4分) void Difference(SqList A, SqList B) {//参考代码如下如下(8分) for (i=0;i<A.length;i++) for(j=0;j<B.length;j++) if(A.data[i]==B.data[j]) { A.data[i]=’#’; break; } for (k=0,i=0;inext == L) return; p = L; while (p->next != L)   { if (p->next->data != e) P = p->next; else { q = p->next;p->next = q->next; free(q);} } } 时间复杂度分析:(2分) 时间复杂度为O(n)。
链表单值化是指将词法分析器从输入流中读取的字符序列转换为一个个单词,并将这些单词按照顺序存储在链表中。具体实现过程如下: 1. 定义一个结构体来表示单词,包括单词的类型和值等信息。 2. 读取输入流中的字符序列,并识别出各个单词的类型和值。 3. 将每个单词保存在一个结构体中,并将这些结构体按照顺序链接在一起,形成一个链表。 4. 返回链表的头指针,供后续的语法分析器使用。 下面是一个简单的C语言链表单值化的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LEN 100 //定义单词的类型 enum TokenType { RESERVED_WORD, IDENTIFIER, NUMBER, SYMBOL }; //定义单词的结构体 struct Token { enum TokenType type; char value[MAX_LEN]; struct Token *next; }; //读取输入流中的字符序列,并识别出各个单词的类型和值 struct Token *lex_analyze(char *input) { struct Token *head = NULL; //链表头指针 struct Token *tail = NULL; //链表尾指针 int len = strlen(input); int i = 0; while (i < len) { //识别保留字 if (strncmp(input + i, "if", 2) == 0 || strncmp(input + i, "else", 4) == 0 || strncmp(input + i, "while", 5) == 0 || strncmp(input + i, "do", 2) == 0) { struct Token *token = (struct Token *) malloc(sizeof(struct Token)); token->type = RESERVED_WORD; strncpy(token->value, input + i, strlen("if")); token->next = NULL; if (head == NULL) { head = tail = token; } else { tail->next = token; tail = token; } i += strlen("if"); } //识别标识符 else if (input[i] >= 'a' && input[i] <= 'z') { struct Token *token = (struct Token *) malloc(sizeof(struct Token)); token->type = IDENTIFIER; int j = i; while (input[j] >= 'a' && input[j] <= 'z') { j++; } strncpy(token->value, input + i, j - i); token->next = NULL; if (head == NULL) { head = tail = token; } else { tail->next = token; tail = token; } i = j; } //识别数字 else if (input[i] >= '0' && input[i] <= '9') { struct Token *token = (struct Token *) malloc(sizeof(struct Token)); token->type = NUMBER; int j = i; while (input[j] >= '0' && input[j] <= '9') { j++; } strncpy(token->value, input + i, j - i); token->next = NULL; if (head == NULL) { head = tail = token; } else { tail->next = token; tail = token; } i = j; } //识别符号 else { struct Token *token = (struct Token *) malloc(sizeof(struct Token)); token->type = SYMBOL; strncpy(token->value, input + i, 1); token->next = NULL; if (head == NULL) { head = tail = token; } else { tail->next = token; tail = token; } i++; } } return head; } //打印单词链表 void print_tokens(struct Token *head) { while (head != NULL) { printf("(%d, %s) ", head->type, head->value); head = head->next; } } int main() { char input[MAX_LEN] = "if (a > b) { c = a - b; } else { c = b - a; }"; struct Token *head = lex_analyze(input); //进行链表单值化 print_tokens(head); //打印单词链表 return 0; } ``` 该示例代码实现了一个简单的C语言词法分析器,可以将输入的C语言代码转换为一个个单词,并按照顺序存储在一个链表中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值