node结点

题目

node结点

如果没有搜索结果或未解决您的问题,请直接 联系老师 获取答案。
相似问题和答案

第1题:

以下程序中函数fun的功能是:构成一个如图所示的带头结点的单词链表,在结点的数据域中放入了具有两个字符的字符串。函数disp的功能是显示输出该单链表中所有结点中的字符串。请填空完成函数disp。[*]

include<stdio.h>

typedef struct node /*链表结点结构*/

{char sub[3];

struct node *next;

}Node;

Node fun(char s) /*建立链表*/

{ … }

void disp(Node *h)

{ Node *


正确答案:

第2题:

函数min()的功能是:在带头结点的单链表中查找数据域中值最小的结点。请填空includestruc

函数min()的功能是:在带头结点的单链表中查找数据域中值最小的结点。请填空

include <stdio.h>

struct node

{ int data;

struct node *next;

};

int min(struct node *first)/*指针first为链表头指针*/

{ struct node *p; int m;

p=first->next; re=p->data; p=p->next;

for( ;p!=NULL;p=【 】)

if(p->data<m ) re=p->data;

return m;

}


正确答案:p->next
p->next 解析:本题考查的知识点是:链表的筛选。题目要求筛选出链表中最小的值,所以需要先定义一个临时变量,并将第1个值赋给该变量,就好像本题程序中定义的变量 m。然后遍历整个链表,拿链表中的每一个值跟m比较,如果找到比m小的值,就让m等于该值,这样遍历结束后,m中就是该链表的最小值了。题目中的空位于for循环的第3个表达式处,这里的for循环就是用来遍历整个链表的,所以该表达式需要完成的任务是:将循环变量p指向当前结点的下一个结点。故不难得知应填p->next。

第3题:

设计递归算法,判断二叉树t是否满足小根堆的特点。二叉链表的类型定义如下:

typedef int datatype;        //结点的数据类型,假设为int

typedef struct NODE *pointer; //结点指针类型

struct NODE {

datatype data;

pointer lchild,rchild;

};

typedef pointer bitree;     //根指针类型


答案:   void moves(sqlist *L) {    int i,j; datatype x;    i=1;j=L->n;     while(i< j) {        while(L->data[i]< 0 && i< j) i++;        while(L->data[j]>=0 && i< j) j--;       if(i< j) {           x=L->data[i];L->data[i]=L->data[j];L->data[j]=x;           i++;j--;        }    } }

第4题:

下列给定程序中,是建立一个带头结点的单向链表,并用随机函数为各结点数据域赋值。函数fun的作用是求出单向链表结点(不包括头结点)数据域中的最大值,并且作为函数值返回。

请改正程序指定部位的错误,使它能得到正确结果。

[注意] 不要改动main函数,不得增行或删行,也不得更改程序的结构。

[试题源程序]

include<stdio.h>

include<stdlib.h>

typedef struct aa

{

int data;

struct aa *next;

}NODE;

fun(NODE *h)

{

int max=-1;

NODE *p;

/***********found************/

p=h;

while(p)

{

if(p->data>max)

max=p->data;

/************found************/

p=h->next;

}

return max;

}

outresult(int s, FILE *Pf)

{

fprintf(pf, "\nThe max in link: %d\n", s);

}

NODE *creatlink(int n, int m)

{

NODE *h, *p, *s, *q;

int i, x;

h=p=(NODE *)malloc(sizeof(NODE));

h->data=9999;

for(i=1; i<=n; i++)

{

s=(NODE *)malloc(sizeof(NODE));

s->data=rand()%m; s->next=p->next;

p->next=s; p=p->next;

}

p->next=NULL;

return h;

}

outlink(NODE *h, FILE *pf)

{

NODE *p;

p=h->next;

fprintf(Pf, "\nTHE LIST:\n\n HEAD");

while(P)

{

fprintf(pf, "->%d", P->datA); p=p->next;

}

fprintf(pf, "\n");

}

main()

{

NODE *head; int m;

head=cteatlink(12,100);

outlink(head, stdout);

m=fun(head);

printf("\nTHE RESULT"\n");

outresult(m, stdout);

}


正确答案:(1)错误:p=h; 正确:p:h->next; (2)错误:p=h->next; 正确:p=p->next;
(1)错误:p=h; 正确:p:h->next; (2)错误:p=h->next; 正确:p=p->next; 解析:程序中使用while循环语句并结合结构指针p来找到数据域中的最大值。
错误1:P指向形参结构指针h的next指针,所以应改为:p=h->next;
错误2:p指向自己的下一个结点,所以应改为:p=p->next

第5题:

阅读以下说明和C语言函数,将应填入(n)。

【说明】

已知包含头结点(不存储元素)的单链表的元素已经按照非递减方式排序,函数 compress(NODE*head)的功能是去掉其中重复的元素,使得链表中的元素互不相同。

处理过程中,当元素重复出现时,保留元素第一次出现所在的结点。

图2-1(a)、(b)是经函数compress()处理前后的链表结构示例图。

链表的结点类型定义如下:

typedef struct Node{

int data;

struct Node *next;

}NODE;

【C语言函数】

void compress(NODE *head)

{ NODE *ptr,*q;

ptr= (1); /*取得第一个元素结点的指针*/

while( (2)&& ptr->next) {

q=ptr->next;

while(q&&(3)) { /*处理重复元素*/

(4)q->next;

free(q);

q=ptr->next;

}

(5) ptr->next;

}/*end of while */

}/*end of compress*/


正确答案:(1)head->next (2)ptr (3)q->data == ptr->data 或ptr->next->data==ptr->data或其等价表示 (4)ptr->next (5)ptr
(1)head->next (2)ptr (3)q->data == ptr->data 或ptr->next->data==ptr->data,或其等价表示 (4)ptr->next (5)ptr 解析:本题考查基本程序设计能力。
链表上的查找、插入和删除运算是常见的考点。本题要求去掉链表中的重复元素,使得链表中的元素互不相同,显然是对链表进行查找和删除操作。
对于元素已经按照非递减方式排序的单链表,删除其中重复的元素,可以采用两种思路。
1.顺序地遍历链表,对于逻辑上相邻的两个元素,比较它们是否相同,若相同,则删除后一个元素的结点,直到表尾。代码如下:
ptr=head->next;/*取得第一个元素结点的指针*/
while(ptr && ptr->next){ /*指针ptr指示出重复序列的第一个元素结点*/
q=ptr->next;
while(q && ptr->data==q->data){/*处理重复元素*/
ptr->next=q->next;/*将结点从链表中删除*/
free(q);
q=ptr->next; /*继续扫描后继元素*/
}
ptr=ptr->next;
}
2.对于每一组重复元素,先找到其中的第一个结点,然后向后查找,直到出现一个相异元素时为止,此时保留重复元素的第一个结点,其余结点则从链表中删除。
ptr=head->next;/*取得第一个元素结点的指针*/
while(ptr && ptr->next){/*指针ptr指示出重复序列的第一个元素结点*/
q=ptr->next;
while(q && ptr->data==q->data) /*查找重复元素*/
q=q->next;
s=ptr->next; /*需要删除的第一个结点*/
ptr->next=q; /*保留重复序列的第一个结点,将其余结点从链表中删除*/
while(s && s!=q}{/*逐个释放被删除结点的空间*/
t = s->next;free(s);s = t;
}
ptr=ptr->next;
}
题目中采用的是第一种思路。

第6题:

在C语言中,可以用typedef声明新的类型名来代替已有的类型名,比如有学生链表结点: typedef struct node{ int data; struct node * link; }NODE, * LinkList; 下述说法正确的是______。

A.NODE是结构体struct node的别名

B.* LinkList也是结构体struct node的别名

C.LinkList也是结构体struct node的别名

D.LinkList等价于node*


正确答案:A
解析:其实题中的定义相当于下述两个定义:typedefstructnode{intdata;structnode*link;}NODE;typedefstructnode{intdata;structnode*link;)*LinkList;前者给structnode取了个新名字NODE,即structnode和NODE是等价的;后者把structnode*命名为LinkList。

第7题:

阅读以下说明和C语言函数,将应填入(n)处的字句写在对应栏内。

【说明】

函数sort (NODE *head)的功能是;用冒泡排序法对单链表中的元素进行非递减排序。对于两个相邻结点中的元素,若较小的元素在前面,则交换这两个结点中的元素值。其中,head指向链表的头结点。排序时,为了避免每趟都扫描到链表的尾结点,设置一个指针endptr,使其指向下趟扫描需要到达的最后一个结点。例如,对于图4-1(a)的链表进行一趟冒泡排序后,得到图4-1(b)所示的链表。

链表的结点类型定义如下:

typedef struct Node {

int data;

struct Node *next;

} NODE;

【C语言函数】

void sort (NODE *head)

{ NODE *ptr,*preptr, *endptr;

int tempdata;

ptr = head -> next;

while ((1)) /*查找表尾结点*/

ptr = ptr -> next;

endptr = ptr; /*令endptr指向表尾结点*/

ptr =(2);

while(ptr != endptr) {

while((3)) {

if (ptr->data > ptr->next->data){

tempdata = ptr->data; /*交换相邻结点的数据*/

ptr->data = ptr->next->data;

ptr->next->data = tempdata;

}

preptr =(4); ptr = ptr -> next;

}

endptr =(5); ptr = head->next;

}

}


正确答案:(1)ptr -> next (2)head->next (3)ptr !=endptr或其等价形式 (4)ptr (5)preptr
(1)ptr -> next (2)head->next (3)ptr !=endptr,或其等价形式 (4)ptr (5)preptr 解析:本题考查链表运算能力。
从题目中的以下代码可知,ptr最后应指向表尾结点。
ptr = head -> next;
while((1))/*查找表尾结点*/
ptr = ptr -> next;
endptr = ptr; /*令endptr指向表尾结点*/
显然,空(1)处应填入“ptr->next”,这样循环结束时,ptr指向表尾结点。若填入“ptr”,则循环结束时,ptr为空指针。
进行冒泡排序时,从头至尾依次比较逻辑上相邻的两个结点的数据,如果小元素在前大元素在后,则交换。这样,经过一趟扫描,就将最大元素交换到了表的最后。下一趟可将次大元素交换到最大元素之前。显然,空(2)处应填入“head->next”。
由于程序设置的endptr用于指示出每趟扫描需到达的最后一个结点,ptr用于依次扫描链表中的结点,因此空(3)处的循环条件为“ptr != endptr”。
显然,指针preptr起的作用是指向ptr的前驱结点,因此,ptr每向后修改一次,相应地preptr就要修改一次,空(4)处应填入“ptr”。本趟循环结束后,下一趟扫描也就确定了,因此在空(5)处填入“preptr”。

第8题:

以下程序的功能是:建立一个带布头结点的单向链表,并将存储在数组中的字符依次存储到链表的各个结点中,请从与下划线处号码对应的一组选项中选择出正确的选项

#include <stdlib.h>

struct node

{char data; struct node *next;};

(48) CreatList(char*s),

{struct node *h,*p,*q;

h=(struct node*)malloc(sizeof(struct node));

p=q=h;

while(*s!="\0")

{ p=(struct node*)malloc(sizeof(struct node));

p->data= (49) ;

q->next=p;

q= (50) ;

s++;

}

p->next="\0";

return h;

}

main()

{ char str[]="link list";

struct node*head;

head=CreatList(str);

}

(1)

A.char*

B.struct node

C.struct node*

D.char


正确答案:C

第9题:

链表题:一个链表的结点结构

struct Node

{

int data ;

Node *next ;

};

typedef struct Node Node ;

(1)已知链表的头结点head,写一个函数把这个链表

逆序( Intel)


正确答案:

Node * ReverseList(Node *head) //链表逆序
{
if ( head == NULL || head->next == NULL )
return head;
Node *p1 = head ;
Node *p2 = p1->next ;
Node *p3 = p2->next ;
p1->next = NULL ;
while ( p3 != NULL )
{
p2->next = p1 ;
p1 = p2 ;
p2 = p3 ;
p3 = p3->next ;
}
p2->next = p1 ;
head = p2 ;
return head ;
}

第10题:

阅读以下说明,Java代码将应填入(n)处的字句写在对应栏内。

【说明】

链表和栈对象的共同特征是:在数据上执行的操作与在每个对象中实体存储的基本类型无关。例如,一个栈存储实体后,只要保证最后存储的项最先用,最先存储的项最后用,则栈的操作可以从链表的操作中派生得到。程序6-1实现了链表的操作,程序6-2实现了栈操作。

import java.io.*;

class Node //定义结点

{ private String m_content;

private Node m_next;

Node(String str)

{ m_content=str;

m_next=null; }

Node(String str,Node next)

{ m_content=str;

m_next=next; }

String getData() //获取结点数据域

{ return m_content;}

void setNext(Node next] //设置下一个结点值

{ m_next=next; }

Node getNext() //返回下一个结点

{ return m_next; )

}

【程序6-1】

class List

{ Node Head;

List()

{ Head=null; }

void insert(String str) //将数据str的结点插入在整个链表前面

{ if(Head==null)

Head=new Node(str);

else

(1)

}

void append(String str) //将数据str的结点插入在整个链表尾部

{ Node tempnode=Head;

it(tempnode==null)

Heed=new Node(str);

else

{ white(tempnode.getNext()!=null)

(2)

(3) }

}

String get() //移出链表第一个结点,并返回该结点的数据域

{ Srting temp=new String();

if(Head==null)

{ System.out.println("Errow! from empty list!")

System.exit(0); }

else

{ temp=Head.getData();

(4) }

return temp;

}

}

【程序6-2】

class Stack extends List

{ void push(String str) //进栈

{ (5) }

String pop() //出栈

{ return get();}

}


正确答案:(1)Head=new Node(strHead); (2)tempnode=tempnode.getNext(); (3)tempnode.setNext(new Node(strtempnode.getNext())); (4)Head=Head.getNext(); (5)insert(str);
(1)Head=new Node(str,Head); (2)tempnode=tempnode.getNext(); (3)tempnode.setNext(new Node(str,tempnode.getNext())); (4)Head=Head.getNext(); (5)insert(str); 解析:本题考查链表和栈的基本特征在Java中的实现。
在对链表进行表头插入时,首先要判断该链表是否为空,如果为空,直接插入结点;如果非空,在插入结点时把该结点的指针域改成能指向下一个结点的地址。在队尾插入时,同样要判断该链表是否为空,如果为空,直接插入结点;如果非空,在插入结点时把上一个结点的指针域改成能指向该结点的地址。
下面来具体分析代码,首先定义了一个结点类,类中有两个不同的构造函数和三个函数,分别用于获取结点数据域,设置下一个结点值和返回下一个结点值。第(1)空是函数insert()里面的代码,函数要实现的功能是将数据str的结点插入在整个链表前面。结合整个函数看,此空处要实现的功能是在非空链表的前面插入结点,需要指针域来存放下一个结点的地址,而下一个结点的地址就是Head,因此,此处应该填Head=new Node(str,Head)。
第(2)空和第(3)空一起考虑,它们都是函数append()里面的内容。函数要实现的功能是将数据str的结点插入在整个链表尾部。这两空要实现的功能是在非空链表的尾部插入结点。这需要调用返回下一个结点值函数和设置下一个结点值函数,因此,第 (2)空和第(3)空的答案分别为tempnode=tempnode.getNext()和tempnode.setNext(new Node(str,tempnode.getNext()))。
第(4)空是函数get()里面的内容,此函数的功能是移出链表第一个结点,并返回该结点的数据域,从整个函数来看,此空处的功能是让链表的地址Head指向下一个结点。因此,答案为Head=Head.getNext()。
第(5)空就比较简单了,要实现的功能就是让数据进栈,而进栈操作是在栈顶进行插入的,因此,只要调用函数insert()即可,其参数是str,此空答案为insert(str)。

更多相关问题