以下程序表达的是什么意思?

以下程序表达的是什么意思?,第1张

整段代码的意思就是实现了链表的新建、节点插入、节点删除和打印等功能

对其进行了详细的注释,如下图:

注释后的代码如下:(其中修改了两处地方,详见注释加粗部分)

#include <malloc.h>

#include <stdio.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

typedef struct LNode { // 链表节点结构体

 渣空亏 ElemType data

  struct LNode * next

} LNode, *LinkList

// 设置别名,LNode等价于struct LNode, LinkList等价于struct LNode *

Status InitList_L(LinkList&L) { // 初始化L链表,新建了第0个节点

  L = (LNode*)malloc(sizeof(LNode))// 分配内存空间

  if ( L == NULL)

      return ERROR

  L->data = NULL

  L->next = NULL

  return OK

}

Status DestroyList_L(LinkList&L) { // 销毁L链表

  LinkList p

  while (L) { // 依次遍历链表上的每个节点

      p = L

      L = L->next

      free(p)// 释放之前分配的内存空间

  }

  return OK

}

// 在链表L的第i个节点前插入新节点,节点值为e

Status ListInsert_L(LinkList &L, int i, ElemType e) {

  LinkList p = L// 注意p初始指向链表第0个节点

  int j = 0

  while (p &&j <i-1) { // p移动到第i-1个节点

      p = p->next

      j++

 如神 }

  if (p == NULL || j >i-1) // i为0或超过链表长度,插入失败

      return ERROR

  else {

      LinkList s = (LNode*)malloc(sizeof(LNode))// 新建待插入的节点

      s->data = e// s值为e,要插入到第i-1个节点之后成为第i个节点

      s->next = p->next// s插入到p和p->next之间

      p->next = s// 满足p-->s-->(p->next)

      return OK

  }

}

// 删除链表L的第i个节点,并令e保存节点值

Status ListDelete_L(LinkList &L, int i, ElemType&e) {

  LinkList p = L// 注意亏乱p初始指向链表第0个节点

  int j = 0

  while (p->next &&j <i-1) { // p移动到第i-1个节点;p不能为最后一个节点

      p = p->next

      ++j

  }

  if (p->next == NULL || j >i-1) // i为0或超过链表长度,删除失败

      return ERROR

  else { // 要删除p之后的节点,即p->next

      LinkList s = p->next// 先保存待删除的节点

      p ->next = s->next// p->next直接指向待删除节点的下个节点

      e = s->data// 保存待删除节点值

      free(s)// 释放节点空间

      return OK

  }

}

void ListPrint_L(LinkList L) { // 打印链表

  LinkList p = L->next// 注意L为第0个节点,L->next才为第1个节点

  printf("LinkList:(")

  while (p) { // 依次输出每个节点值

      printf("%d,", p->data)

      p = p->next

  }

  printf(")\n")

}

void ListInput(LinkList&L) {

  int n

  printf("please input number:")

  scanf("%d", &n)// 输入链表节点个数

  for(int i = 0i <ni++) // 这里原代码多加了一个分号要去掉

  {

      int v

      scanf("%d", &v)// 输入每个节点值

      ListInsert_L(L, 1, v)// 每个节点都插入到第1个位置

  }

}

int main(int argc, char* argv[]) {

  char s[256]

  printf("Input your name:")

  printf("%s\n", gets(s))

  LinkList LInitList_L(L)ListPrint_L(L)// 初始化空链表L,新建第0个节点

  ListInput(L)//调用输入函数

  //ListInsert_L(L,1,1)

  //ListInsert_L(L,2,5)

  //ListInsert_L(L,3,8)

  //ListInsert_L(L,4,10)

  ListPrint_L(L)// 打印新建的链表

  int v

  ListDelete_L(L, 3, v)// 删除第3个节点,获取其值到v中

  ListPrint_L(L)// 打印删除后的链表

  DestroyList_L(L)// 最后还应销毁链表,释放内存空间

  return 0

}

第一题:p先指向了薯段a[1],然后y逐步累加,也就是y = 1+4+6+8 = 19。

第二题:重点考核静态变量(也就是f()中的c变量)。第一次调用灶手州f()后输出2+1+4=7,第二次调用f()后输出2+1+5=8,第三次调用f()后输出2+1+6=9。

第三题:重点考核switch-case语句的构成。由于缺了break语句,所以第一次循环会执行default分支后直接退出;第二次循环则会悲催地执行case 1分支、之后顺序将case 2和default也蹂躏个遍;第三次循环执行case 2分支、之后又在default上踩一脚……隐蔽

百度嫌我字数不够

你刚发的图片,我码了半天的字,结果删了?!我直接复制的。。连你没打出来的第二题一并给你解决了。。

第一题: 02

原因:switch(a)进入case1:switch(b)的时候输出0,但是case1运行完了并没有break跳出,那麼继续运行case2,故输出02.

第二题:a=5,销携裤b=2,c=1

原因:大括号里边的变隐余量是局部变量,在上一级变量和局部变量重名时,以局部变量优先级高,故局部变量C的最终结果是2,a+=2,则a为5,而上一级变量的b、c不参与运算,故依旧为2、1。

第三题:6

原因:非0数的真值都是1,那麼除了if(!y)都执行,则z=2+1+3=6

第四题:46

原因:这里有个小陷阱,虽然每个if都要对应一个else,但是第一个亏简if下没有大括号,则第二个if后的;应作为第一个if的结束,故题中唯一一个else应对应的是第一个if。

第五题:t=4

原因:这导题正好是第四题的反面例子,if语句会寻找下一个;作为结束标志,但else不会,故else以後的if-else是正常逻辑运行。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12502680.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存