安徽省公务员考试计算机专业知识编程题.docx
《安徽省公务员考试计算机专业知识编程题.docx》由会员分享,可在线阅读,更多相关《安徽省公务员考试计算机专业知识编程题.docx(18页珍藏版)》请在冰豆网上搜索。
安徽省公务员考试计算机专业知识编程题
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;jscanf("%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;iprintf("%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
头插法建立链表,无论带不带头结点
都无需考虑第一个节点空和头不空