安徽省公务员考试计算机专业知识编程题.docx

上传人:b****8 文档编号:10582901 上传时间:2023-02-21 格式:DOCX 页数:18 大小:18.05KB
下载 相关 举报
安徽省公务员考试计算机专业知识编程题.docx_第1页
第1页 / 共18页
安徽省公务员考试计算机专业知识编程题.docx_第2页
第2页 / 共18页
安徽省公务员考试计算机专业知识编程题.docx_第3页
第3页 / 共18页
安徽省公务员考试计算机专业知识编程题.docx_第4页
第4页 / 共18页
安徽省公务员考试计算机专业知识编程题.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

安徽省公务员考试计算机专业知识编程题.docx

《安徽省公务员考试计算机专业知识编程题.docx》由会员分享,可在线阅读,更多相关《安徽省公务员考试计算机专业知识编程题.docx(18页珍藏版)》请在冰豆网上搜索。

安徽省公务员考试计算机专业知识编程题.docx

安徽省公务员考试计算机专业知识编程题

 

JINGLEI

 

线性表是最简单、最基本的、最常用的一种线性结构。

它有两种存

储方法:

顺序存储和链式存储。

线性表的顺序存储是指在内存中用地

址连续的一块存储空间顺序存放线性表的各元素,一旦申请某一数组,

元素数量不能随意增加并且插入、删除要移动数据,但它具有随机存

取的特点。

链式存储结构不要求数据相邻,它通过指针建立起他们之

间的逻辑关系,因此对线性表的插入、删除不需移动数据且动态性较

好,但不能随机访问数据。

安徽省公务员计算机专业知识程序设计题中考的是链式存储结构,

且以单链表的建立加以循环判断和输入输出的考察为主,难点和重点

是单链表的建立。

编程语言为C语言。

一.单链表表示

链表是通过一组任意的存储单元来存储线性表中的数据元素。

为建立

起数据元素之间的线性关系,对每个数据元素ai,除了存放数据元素

的自身信息ai之外,还需要和ai一起存放其后继ai+1所在的存储单

元的地址,这两部分信息组成一个“节点”,节点的结构如图1。

Data

 

Next

图1单链表节点结构

其中,存放数据元素信息的称为数据域,存放其后继地址的称为指针

域。

以此n个元素的线性表通过每个节点的指针域拉成了一个“链”,

称之为链表。

因为每个节点中只有一个指向后继的指针,所以称之为

单链表,如图2。

 

1

 

JINGLEI

 

L

 

1

 

2

 

 

n

 

^

图2单链表示意图

TypedefstructLNode

{

Elemtypedata;//数据域

structLNode*next;//指针域

}LNode,*LinkList;

LinkListL;//L为单链表的头指针

通常用“头指针”来标识一个单链表,如单链表L、单链表H等,是

指某链表的第一个节点的地址放在了指针变量L、H中,头指针为

“NULL”则表示一个空表。

二.建立单链表

★头插法——在链表的头部插入节点建立单链表

链表与顺序表不同,它是一种动态管理的存储结构,链表中的每个节

点占用的存储空间不是预先分配,而是运行时系统根据需求生成的,

以此建立单链表从空表开始,每读入一个数据元素则申请一个节点,

然后插在链表的头部。

图3展现了线性表:

1,2,3,4,5)在链表的头部

插入节点建立链表的过程。

因为是在链表的头部插入,读入数据的顺

序和线性表中的逻辑顺序是相反的。

L=NULL

L

 

1

 

^

L

 

2

 

1

 

^

 

2

 

JINGLEI

 

L

 

3

 

2

 

1

 

^

L

 

4

 

3

 

2

 

1

 

^

L

 

5

 

4

 

3

 

2

 

1

 

^

图3头插法建立单链表过程

【算法1如下】

LinkListCreate_LinkList1()

{

LinkListL=NULL;//空表

LNode*s;

intx;//设数据元素的类型为int

scanf("%d",&x);

while(x!

=flag)//flag为输入结束标记

{

s=(LNode)malloc(sizeof(LNode));

s->data=x;

s->next=L;L=s;

scanf("%d",&x);

}

returnL;

}

 

★尾插法——在单链表的尾部插入节点建立单链表

 

3

 

JINGLEI

 

头插入建立单链表简单,但读入的数据元素的顺序与生成的链表中与

元素的顺序是相反的,若希望次序一致,则用尾插法的方法。

因为每

一次是将新节点插入到链表的尾部,所以需要加入一个指针r用来始

终指向链表中的尾节点,以便能够将新节点插入到链表的尾部,图4

展现了线性表:

(1,2,3,4,5)在链表的尾部插入节点建立链表的过程。

算法思路:

初始状态,头指针L=NUUL,尾指针r=NULL;按线性表中的

顺序依次读入数据元素,不是结束标志时,申请新节点,将新节点插

入到r所指节点的后面,然后r指向新节点(注意第一个节点有所不

同)。

L=NULL,r=NULL

 

r

L

 

1

 

r

L

 

1

 

2

 

r

L

 

1

 

2

 

3

 

r

L

 

1

 

2

 

3

 

4

 

r

L

 

1

 

2

 

3

 

4

 

5

 

^

图4尾插法建立单链表过程

【算法2如下】

LinkListCreate_LinkList2()

{

LinkListL=NULL;//空表

LNode*s,*r=NULL;

intx;//设数据元素的类型为int

 

4

 

JINGLEI

 

scanf("%d",&x);

while(x!

=flag)//flag为输入结束标记

{

s=(LNode)malloc(sizeof(LNode));

s->data=x;

if(L==NULL)L=s;

elser->next=s;

r=s;//r指向新的尾节点

scanf("%d",&x);

}

if(r!

=NULL)r->next=NULL;//对于非空表,最后节点的指针域放

空指针

returnL;

}

在以上算法中,第一个节点的处理和其他节点是不同的,原

因是第一节点加入时链表为空,它没有直接前驱结点,他的地址

就是整个链表的指针,需要放在链表的头指针变量中;而其他节

点有直接前驱结点,其地址放入直接前驱结点的指针域。

“第一

个节点”的问题很多操作中都会遇到,如在链表中插入节点时,

将节点插在第一个位置和其他位置是不同的,在链表的删除节点

时,删除第一个节点和其他节点的处理也是不同的,等等。

为了操作方便,有时在链表的头部加入一个“头结点”,头

 

5

 

JINGLEI

 

结点的类型与数据节点一致,标识链表的头指针变量L中存放该

节点的地址,这样即使是空表,头指针变量L也不为空了。

头结

点的加入使得“第一个节点”的问题不再存在,也使得“空表”

和“非空表”的处理成为一致。

头结点的加入完全是为了运算的方便,他的数据域无定义,

指针域中存放的是第一个数据节点的地址,空表时为空。

图5(a)、(b)分别是带头结点的单链表空表和非空表的示意图。

L

 

^

 

(a)

L

 

1

 

2

 

 

n

 

^

 

(b)

图5带头结点的单链表

尾插法建立带头结点的单链表,将算法2改成算法3

【算法3如下】

LinkListCreate_LinkList2()

{

LinkListL=(LNode)malloc(sizeof(LNode));

L->next=NULL;//空表

LNode*s,*r=L;

intx;//设数据元素的类型为int

scanf("%d",&x);

while(x!

=flag)//flag为输入结束标记

{

s=(LNode)malloc(sizeof(LNode));

 

6

 

JINGLEI

 

s->data=x;

r->next=s;//其他节点的处理

r=s;//r指向新的尾节点

scanf("%d",&x);

}

r->next=NULL;//对于非空表,最后节点的指针域放空指针

returnL;

}

 

7

 

JINGLEI

 

2011年安徽省公务员计算机专业知识程序设计题

不带头结点的尾插法建立链表

六.程序设计题

以下程序找出课程平均分60分以上(包括60分)的学生,并输出这

些学生的信息,请补充下列C语言程序中的空格部分代码。

#include

#include

 

头文件

#defineM3/*学生人数*/

#defineN3/*课程数目*/

structstudent

{

longstudentnum;/*学号*/

 

定义全局变量

 

student结构体定义

charname[20];/*学生的姓名*/

floatscore[N];/*课程的分数*/

structstudent*next;/*next是用来存放和student类型相同的结构体变

量地址的指针型*/

}

/*创建链表*/

structstudent*createlink(intn)

{

structstudent*head=NULL,*p1,*p2;/*p1指向新申请的节点,p2始终

指向链表的终结点*/

 

8

 

JINGLEI

 

inti,j;

for(i=1;i

建立空链表

 

{

p1=(structstudent*)malloc(sizeof(structstudent));/*p1指向新节点,

malloc函数申请节点所需内存空

间的方法,sizeof测量节点所占空

间大小的函数*/

printf("请输入第%d个学生的学号、姓名及各门课考试成绩:

\n",i);

scanf("%d%s",&p1->studentnum,p1->name);

for(j=0;j

scanf("%f",&p1->score[j]);

p1->next=NULL;

if(【head=NULL】)

head=p1;

else

p2->next=p1;

p2=p1;

 

1不带头结点的尾插法,分第一个节点空和不空两种情况

 

2带头结点的尾插法,无需考虑第一个节点空和不空

}

return(【head】);

}

/*主函数*/

voidmain()

 

9

 

JINGLEI

 

{

structstudent*head=NULL;

inti;

floatsum,aver;

【structstudent*p】;

p=head;

while(p!

=NULL)

{

sum=0;

for(i=0;i

【sum+=p->score[i]】;

aver=sum/N;

if(【aver>=60】)

{

printf("学号:

%d姓名:

%s",p->studentnum,p->name);

for(i=0;i

printf("%f",p->score[i]);

printf("\n");

}

}

}

 

10

 

JINGLEI

 

2010年安徽省公务员计算机专业知识程序设计题

头插法建立链表

五.程序设计题

#include

 

/*结构体定义*/

StructList

{

intdata;

StructList*next;/**/

};

 

TypedefstructListnode;/*将structlist命名为node*/

Typedefnode*link;

 

/*主函数*/

voidmain()

{

linkptr,head,tail;

intnum,i;

tail=(link)malloc(sizeof(node));

 

建立空链表

tail->next=【NULL】;

 

11

 

JINGLEI

 

ptr=tail;/*ptr始终指向头结点*/

printf("\npleaseinputdata:

\n");

for(i=0;i<=4;i++)

{

scanf("%d",【&num】);

ptr->data=num;

head=(link)malloc(sizeof(node));

head->next=【ptr】;

ptr=head;

}

while(ptr!

=NULL)

{

printf("thevalueis%d\n",【p->data】;

ptr=ptr->next);

}

}

 

12

 

头插法建立链表,无论带不带头结点

 

都无需考虑第一个节点空和头不空

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1