阅读下列函数说明和C代码,将应填入(n)处的字句写在对应栏内。 假设以带头结点的单循环链表作非递减有序线性表的存储结构。函数deleteklist(LinkList head)的功能是删除表中所有数值相同的多余元素,并释放结点空间。 例如:链表初始

admin2009-02-15  48

问题 阅读下列函数说明和C代码,将应填入(n)处的字句写在对应栏内。
假设以带头结点的单循环链表作非递减有序线性表的存储结构。函数deleteklist(LinkList head)的功能是删除表中所有数值相同的多余元素,并释放结点空间。
   例如:链表初始元素为:
   (7, 10,10,21,30,42,42,42,51,70)
   经算法操作后变为:
   (7,10,21,30,42,51,70)
  【函数3.1】
   void deleteklist(LinkList head)
   {
       LinkNode * p, * q;
       p=head->next;
       while(p!=head)
       {
           q=p->next;
          while((1))
           {   
                 (2);
              free(q);
              q=p->next;
           }
           p=p->next;
       }
   }   
  【说明3.2】
   已知一棵完全二叉树存放于一个一维数组T[n]中,T[n]中存放的是各结点的值。下面的程序的功能是:从T[0]开始顺序读出各结点的值,建立该二叉树的二叉链表表示。
  【函数3.2】
   #include<istream.h>  
   typedef struct node {
      int data;
      stuct node leftChild, rightchild;
   } BintreeNode;
   typedef BintreeNode * BinaryTree;
   void ConstrncTree(int T[], int n, int i, BintreeNode * &ptr)
       if(i>=n)(3);     /*置根指针为空*/
       else
           {
               ptr=-(BTNode * )malloc(sizeof(BTNode) )
               ptr->data=T;
               ConstrucTree(T,n,2, i+1, (4));
               ConstrucTree(T,n,(5),ptr->rightchild);
           }
   }
   main(void)
   {        /*根据顺序存储结构建立二叉链表*/
       Binarytree bitree;int n;
       printf("please enter the number of node: \n%s" ;n);
       int* A = (int *) malloc(n * sizeof(int));
       for(int i=0;i<n;i++)scanf(" %d,A+i);      /*从键盘输入结点值*/
       for(int i=0;i<n;i++)printf(" %d",A);
       ConstructTree(A, n,0, bitree);
   }

选项

答案(1)q!= head &&q->data==p->data (2)p->next=q->next (3)ptr=NULL (4)ptr->leftchild (5)2*i+2

解析 这一题共有两个程序,第一个函数是考查链表操作,第二个程序是使用递归法创建链式存储的二叉树。
   先看第一个函数。这个函数由于while循环实现对链表的遍历,在这个while循环中又嵌套着一个while循环,内循环实现了删除相同元素的功能。由说明和程序可知,p指针指向当前遍历结点,q指向当前结点的后继结点,如果这两个结点的数据域相等,则将其删除。这个循环何时结束呢?显然,当这两个结点的数据域不相等时要结束,或者当 q指向链表头结时,整个链表已经遍历完了也要结束,因此(1)空处应填写“q!=head && q->data==p->data”或其等价形式。如果指针P和指针q所指的结点的数据域相等,则要将指针q所指的结点删除,从内存中释放空间必须要使指针q所指的结点的后继结点接到指针p所指的结点后,因此(2)空处应填写“p->next=q->next”。
   再来分析第二个程序。该程序由两个函数组成,函数main()实现数据输入,函数ConstrueTree(int T[], int n, int i, BintreeNode * &ptr)用于建立二叉链表。根据(3)空所在语句的注释,很容易填写。当i>=n时,就说明二叉树不存这个结点,即将根指针置空,因此(3)空应填写“ptr=NULL”,当i<n时,先生成一个结点,将数组T[]第i个元素数据填入该结点,建立结点的左子树和右子树。根据完全二叉树的顺序存储的定义,可以第i个元素左子树根结点为2*i+1,右子树的根结点为2 *i+2。因此第一条递归调用是建立左子树,第二条递归调用是建立右子树。因此(4)空应填写“ptr->leftchild”,(5)空应填写“2*i+2”。
转载请注明原文地址:https://jikaoti.com/ti/UvW7FFFM
0

最新回复(0)