ZIP压缩包下载:https://pan.axianyu.cn/f/5mLsy/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84.zip
一.数据结构作业1-绪论
数据元素是数据的最小单位。
数据的逻辑结构是指数据的各数据项之间的逻辑关系。
数据结构概念包括数据之间的逻辑结构、数据在计算机中的存储方式和数据的运算三个方面。
算法和程序没有区别,在数据结构中二者是通用的。
是的。
算法分析的两个主要方面是时间复杂度和空间复杂度的分析。
is .
O(),O(1+2+···+n) 对应的算法时间复杂度相同。
对于某些算法,随着问题规模的扩大,所花的时间不一定单调增加。
算法可以没有输入,但是必须有输出。
用渐进表示法分析算法复杂度的增长趋势。
数据元素可以由类型互不相同的数据项构成。
算法独立于具体的程序设计语言,与具体的计算机无关。
关于《数据结构》学科
《数据结构》是一门研究数值计算的程序设计问题的学科。
解决问题的效率,跟数据的组织方式无关。
数据类型由数据对象集和数据集合相关联的操作集组成。
(neuDS)数据的物理结构是指数据在计算机中的实际存储形式。
时间复杂度是根据算法写成的程序在执行时耗费时间的长度,往往与输入数据的规模有关。
An algorithm must terminate after finite number of steps.
和具有相同的增长速度。
在数据结构中,从逻辑上可以把数据结构分为( )。
算法分析的目的是( )
通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着( )
采用链结构存储线性表时,其地址( )。
在计算机存储器内表示时,物理地址和逻辑地址相同并且是连续的,称之为( )
一个正确的算法应该具有 5 个特性,除输入、输出特性外,另外 3 个特性是( )。
下面程序段的时间复杂度是()。
x=90;
y=100;
while(y>0)
if(x>100)
{ x=x-10; y--; }
else x++;
下面代码段的时间复杂度是()。
x=0;
for( i=1; i<n; i++ )
for ( j=1; j<=n-i; j++ )
x++;
下面代码段的时间复杂度是()。
for ( i=0; i<n; i++ )
for ( j=0; j<m; j++ )
a[i][j]=0;
下列代码
if ( A > B ) {
for ( i=0; i<N; i++ )
for ( j=N*N; j>i; j-- )
A += B;
}
else {
for ( i=0; i<N*2; i++ )
for ( j=N*2; j>i; j-- )
A += B;
}
的时间复杂度是:
在数据结构中,与所使用的计算机无关的是数据的( )结构。
- 当输入规模为n时,下列算法渐进复杂性中最低的是
数据逻辑结构可以分为( )。
在计算机的存储器中表示时,逻辑上相邻的两个元素对应的物理地址也是相邻的,这种存储结构称之为( )
算法的时间复杂度与( )有关
某算法的时间复杂度为O(),表明该算法的( )
以下说法正确的是( )
数据结构被形式定义为(D,S),其中D是( )的有限集合。
以下说法正确的是 ▁▁▁▁▁。
在线性结构中,数据元素之间除同属于一个集合外, ▁▁▁▁▁ 。
在树形结构中,数据元素之间除同属于一个集合外, ▁▁▁▁▁ 。
在图状结构中,数据元素之间除同属于一个集合外, ▁▁▁▁▁ 。
在集合结构中,数据元素之间除同属于一个集合外, ▁▁▁▁▁ 。
执行下面程序段时,执行S语句的次数为( )
for(int i=1; i<=n; i++)
for(int j=1;j<=n; j++)
S;
以下项的大小顺序为( )。
二.数据结构作业2-线性表
若用链表来表示一个线性表,则表中元素的地址一定是连续的。
循环链表不是线性表。
带头结点的单循环链表中,任一结点的后继结点的指针域均不空。
链式存储的优点是插入、删除元素时不会引起后续元素的移动,缺点是只能顺序访问各元素。
线性表L如果需要频繁地进行不同下标元素的插入、删除操作,此时选择顺序存储结构更好。
(neuDS)在线性表的顺序存储结构中可实现快速的随机存取,而在链式存储结构中则只能进行顺序存取。
链表的每个结点都恰好有一个指针。
线性表的顺序存储表示优于链式存储表示。
链表 - 存储结构
链表中逻辑上相邻的元素,其物理位置也一定相邻。
对于顺序存储的长度为的线性表,访问结点和增加结点的时间复杂度分别对应为和。
若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用顺序表存储最节省时间。
(neuDS)在顺序表中逻辑上相邻的元素,其对应的物理位置也是相邻的。
(neuDS)所谓随机存取,就是通过首地址和元素的位序号值可以在O(1)的时间内找到指定的元素。
(neuDS)线性表的长度是指线性表所占用的存储空间的大小。
线性表的逻辑顺序与物理顺序总是一致的。
线性表中每个元素都有一个直接前趋和一个直接后继。
线性表中的所有数据元素的数据类型必须相同。
在N个结点的顺序表中访问第i(1<=i<=N)个结点和求第i(2<=i<=N)个结点直接前驱的算法时间复杂度均为O(1)。
链式存储的存储结构所占存储空间( )
将线性表La和Lb头尾连接,要求时间复杂度为O(1),且占用辅助空间尽量小。应该使用哪种结构?
链表不具有的特点是:
带头结点的单链表h
为空的判定条件是:
已知头指针 h
指向一个带头结点的非空单循环链表,结点结构为 data | next
,其中 next
是指向直接后继结点的指针,p
是尾指针,q
是临时指针。现要删除该链表的第一个元素,正确的语句序列是:
现有非空双向链表 ,其结点结构为:
,prev
是指向直接前驱结点的指针,next
是指向直接后继结点的指针。若要在 中指针 p
所指向的结点(非尾结点)之后插入指针 s
指向的新结点,则在执行了语句序列 s->next = p->next; p->next = s;
后,下列语句序列中还需要执行的是:
对一个具有n个元素的线性表,建立其单链表的时间复杂度为()。
单链表中,增加一个头结点的目的是____。
在单链表中,要删除某一指定结点,必须先找到该结点的()。
双链表 - 插入结点
在双链表中,将 s 所指新结点插入到 p 所指结点之后,其语句应该为 ▁▁▁▁▁ 。
在个结点的顺序表中,算法的时间复杂度为O(1)的操作是:
以下说法错误的是( )。
顺序表是线性表的( )
若长度为n的线性表采用顺序结构,在第i个数据元素之前插入一个元素,需要它依次向后移动()个元素。
线性表L=(a1, a2 ,……,an )用一维数组表示,假定删除线性表中任一元素的概率相同(都为1/n),则删除一个元素平均需要移动元素的个数是()。
对于顺序表的优缺点,以下说法错误的是( )。
顺序存储表示中数据元素之间的逻辑关系是由( )表示的。
设顺序表L中有n个数据元素,则删除该表中第i个数据元素需要移动移动 个元素。
对于顺序存储的长度为的线性表,访问结点和增加结点的时间复杂度为:
线性表若采用链式存储结构时,要求内存中可用存储单元的地址
线性表L在什么情况下适用于使用链式结构实现?
对于一个具有个结点的单链表,在给定值为的结点后插入一个新结点的时间复杂度为
设h
为不带头结点的单向链表。在h
的头上插入一个新结点t
的语句是:
某线性表采用顺序存储结构,每个元素占4个存储单元,首地址为100,则第12个元素的存储地址为()。
已知表头元素为c
的单链表在内存中的存储状态如下表所示:
现将f
存放于1014H
处,并插入到单链表中,若f
在逻辑上位于a
和e
之间,则a
、e
、f
的“链接地址”依次
是:
非空线性表的结构特征
(1) 存在 (2分) 开始结点。
(2) 存在 (2分) 终端结点。
(3) 除 (2分) 外,每个结点都有 (2分) 前驱结点。
(4) 除 (2分) 外,每个结点都有 (2分) 后继结点。
请填:一个、多个、开始结点、终端结点。
本题目要求利用尾插法建立单链表。
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
LinkList Create();
void print( LinkList L);
int main()
{
LinkList L = Create();
print(L);
return 0;
}
LinkList Create()
{
LinkList L,p,s;
ElemType e;
L = (LinkList)malloc(sizeof(LNode));
L->next=NULL;
p=L(2分);
scanf("%d",&e);
while(e!=-1)
{
s = (LinkList)malloc(sizeof(LNode));
s->data=e;
p->next=s(3分);
p=s(3分);
scanf("%d",&e);
}
p->next=NULL;
return L(2分);
}
void print(LinkList L)
{
LinkList p;
p=L->next;
while (p)
{
printf("%d ", p->data);
p =p->next;
}
}
#输入格式:
输入数据为若干正整数,最后以-1表示结尾(-1不算在序列内,不要处理)。所有数据之间用空格分隔。
#输入样例:
1 2 3 4 5 6 7 8 9 -1
#输出样例:
1 2 3 4 5 6 7 8 9
本题目要求以头插法建立单链表。
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
LinkList Create();
void print( LinkList L);
int main()
{
LinkList L = Create();
print(L);
return 0;
}
LinkList Create()
{
LinkList L,s;
ElemType e;
L = (LinkList)malloc(sizeof(LNode));
L->next=NULL(2分);
scanf("%d",&e);
while(e!=-1)
{
s = (LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=L->next(3分);
L->next=s(3分);
scanf("%d",&e);
}
return L(2分);
}
void print(LinkList L)
{
LinkList p;
p=L->next;
while (p)
{
printf("%d ", p->data);
p =p->next;
}
}
#输入格式:
输入数据为若干正整数,最后以-1表示结尾(-1不算在序列内,不要处理)。所有数据之间用空格分隔。
#输入样例:
1 2 3 4 5 6 7 8 9 -1
#输出样例:
9 8 7 6 5 4 3 2 1
三.数据结构作业3-栈和队列
采用顺序存储结构的循环队列,出队操作会引起其余元素的移动。
可以通过少用一个存储空间的方法解决循环队列中队空和队满条件的区分。
n个元素进队的顺序和出队的顺序总是一致的。
栈和队列的存储方式,既可以是顺序方式,也可以是链式方式。
可以通过少用一个存储空间的方法解决循环队列假溢出现象。
队列的特性
队列是后进先出的线性表。
在对不带头结点的链队列作出队操作时,不会改变头指针的值。
不论是入队列操作还是入栈操作,在顺序存储结构上都需要考虑"溢出"情况。
栈是插入和删除只能在一端进行的线性表;队列是插入在一端进行,删除在另一端进行的线性表。
队列中允许插入的一端叫队头,允许删除的一端叫队尾。 ~@
通过对堆栈S操作:Push(S,1), Push(S,2), Pop(S), Push(S,3), Pop(S), Pop(S)。输出的序列为:123。
序列{1,2,3,4,5}依次入栈,则不可能得到{3,4,1,2,5}的出栈序列。
在n个元素连续进栈以后,它们的出栈顺序和进栈顺序一定正好相反。
Run the following operations on a stack S: Push(S,1), Push(S,2), Pop(S), Push(S,3), Pop(S), Pop(S). The output sequence must be {1, 2, 3}.
栈底元素是不能删除的元素。
栈结构不会出现溢出现象。
链栈的插入在栈顶,删除在栈底。
堆栈适合解决处理顺序与输入顺序相同的问题。
所谓“循环队列”是指用单向循环链表或者循环数组表示的队列。
在用数组表示的循环队列中,front值一定小于等于rear值。
设栈S和队列Q的初始状态均为空,元素{1, 2, 3, 4, 5, 6, 7}依次进入栈S。若每个元素出栈后立即进入队列Q,且7个元素出队的顺序是{2, 5, 6, 4, 7, 3, 1},则栈S的容量至少是:
若栈采用顺序存储方式存储,现两栈共享空间V[1 m],top[1]、top[2]分别代表第1和第2个栈的栈顶,栈1的底在V[1],栈2的底在V[m],则栈满的条件是( )。
循环顺序队列中是否可以插入下一个元素()。
设循环队列的存储空间为a[0..20],且当前队头指针和队尾指针的值分别为8和3,则该队列中元素个数为( )
现采用大小为10的数组实现一个循环队列。设在某一时刻,队列为空且此时front和rear值均为5。经过若干操作后,front为8,rear为2,问:此时队列中有多少个元素?
循环队列的队满条件为 ( )。
已知初始为空的队列 Q 的一端仅能进行入队操作,另外一端既能进行入队操作又能进行出队操作。若 Q 的入队序列是 1、2、3、4、5,则不能得到的出队序列是:
带头结点的链式队列(包含数据结点)的尾指针rear指向( )
对于容量为n的循环队列Q,队尾指针是Q.rear,队头指针是Q.front,则出队时头尾指针需要进行的操作为 ( )
循环队列的引入,目的是为了克服( )。
判断一个循环队列QU(最多元素为MaxSize)为空的条件是()。
对空栈 进行 Push 和 Pop 操作,入栈序列为 a, b, c, d, e,经过 Push, Push, Pop, Push, Pop, Push, Push, Pop 操作后,得到的出栈序列是:
若元素a、b、c、d、e、f依次进栈,允许进栈、退栈操作交替进行,但不允许连续三次进行退栈工作,则不可能得到的出栈序列是?
设一个堆栈的入栈顺序是1、2、3、4、5。若第一个出栈的元素是4,则最后一个出栈的元素必定是:
若top
为指向栈顶元素的指针,判定栈S
(最多容纳m
个元素)为空的条件是:
利用大小为n
的数组(下标从0
到n-1
)存储一个栈时,假定栈从数组另一头开始且top==n
表示栈空,则向这个栈插入一个元素时,修改top指针应当执行:
以下不是栈的基本运算的是( )。
设顺序栈的栈顶指针(int 类型)指向栈顶元素位置,则判断一个栈ST(最多元素为MaxSize)为栈满的条件是()。
在一个链队列中,front和rear分别为头指针和尾指针,则插入一个结点s的操作为( )。
关于栈和队列的下列说法正确的是()
假设链队列头指针直接指向队头元素,进行出队操作时需要的操作为( )。
循环队列存储在一维数组A[0..m-1](下标从0到m-1)中,入队操作应执行( )
设计一个判别表达式中左、右括号是否配对出现的算法,采用( )数据结构最佳。
循环队列顺序存储在数组A[1..50]中,队头front和队尾rear的初值为0。如当前rear的值为10,front的值为35,则队列中的元素个数为( )。
判定一个顺序栈st(最多元素为MaxSize)为满的条件是( ) 。
一个栈的进栈序列是a,b,c,d,e,则栈的不可能的输出序列是( )。
已知一个栈的进栈序列是1,2,3,…,n,其输出序列是p1,p2,…,pn,若p1=n,则pi的值为( )
利用栈实现十进制整数1234转八进制,以下哪项栈表状态符合实际情况:
若已知一个栈的入栈顺序是A、B、C、D,其出栈序列为P1、P2、P3、P4,则P2、P4不可能是()。
栈和队列具有相同的。
下面函数In_SeQueue ( c_SeQueue *q , datatype x)实现了循环队列的入队算法。请填空。 循环队列类型说明:
define MAXSIZE 1024 /*队列的最大容量*/
typedef struct
{ datatype data[MAXSIZE]; /*队员的存储空间*/
int rear,front; /*队头队尾指针*/
int num; /*队中元素个数*/
} c_SeQueue;
int In_SeQueue ( c_SeQueue *q , datatype x)
{
if (num==MAXSIZE)
{ printf("队满");
return –1;
}
else
{ q->rear=(3分) ;
(3分);
num++;
return 1;
}
}
下面函数Push_SeqStack (SeqStack *s, datatype x)实现了在顺序栈的入栈算法。请填空。 顺序栈类型说明:
#define MAXSIZE 1024
typedef struct
{ datatype data[MAXSIZE];
int top;
}SeqStack;
int Push_SeqStack (SeqStack *s, datatype x)
{ if (s->top==MAXSIZE-1) return 0;
else {
(3分) ;
(3分);
return 1;
}
}
四.数据结构实验2-链表
本题要求实现一个函数,统计学生学号链表中专业为计算机的学生人数。链表结点定义如下:
struct ListNode {
char code[8];
struct ListNode *next;
};
这里学生的学号共7位数字,其中第2、3位是专业编号。计算机专业的编号为02。
函数接口定义:
int countcs( struct ListNode *head );
其中head
是用户传入的学生学号链表的头指针;函数countcs
统计并返回head
链表中专业为计算机的学生人数。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct ListNode {
char code[8];
struct ListNode *next;
};
struct ListNode *createlist(); /*裁判实现,细节不表*/
int countcs( struct ListNode *head );
int main()
{
struct ListNode *head;
head = createlist();
printf("%d\n", countcs(head));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
1021202
2022310
8102134
1030912
3110203
4021205
#
输出样例:
3
int countcs(struct ListNode *head) { struct ListNode *p; p=head; //p指针指向第一个元素(注意本题的head链表没有头结点) int count=0; //计算机专业学生人数 while(p!=NULL) //如果p指针指向的结点存在 { if(p->code[1]=='0'&&p->code[2]=='2') //如果是计算机专业学生 count++; //count加1 p=p->next; //p指针后移 } return count; }
a.c: In function ‘createlist’: a.c:17:5: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result] scanf("%s", s); ^~~~~~~~~~~~~~ a.c:24:9: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result] scanf("%s", s); ^~~~~~~~~~~~~~
测试点 | 结果 | 测试点得分 | 耗时 | 内存 |
---|---|---|---|---|
0 | 答案正确 | 10 | 2.00 ms | 208 KB |
1 | 答案正确 | 6 | 3.00 ms | 196 KB |
2 | 答案正确 | 4 | 3.00 ms | 476 KB |
本题要求实现一个函数,返回带头结点的单链表中最大元素的地址。
函数接口定义:
LinkList MaxP( LinkList L);
L是带头结点的单链表的头指针,函数MaxP返回表中最大元素的地址。如果单链表为空,返回空指针。
其中LinkList结构定义如下:
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
LinkList Create();/* 细节在此不表 */
LinkList MaxP( LinkList L);
int main()
{
LinkList L,p;
ElemType e;
L = Create();
p = MaxP(L);
if(p)
printf("%d\n", p->data);
else
printf("NULL");
return 0;
}
/* 你的代码将被嵌在这里 */
输入格式:
输入数据为1行,给出以-1结束的单链表元素(-1不属于单链表元素),所有数据之间用空格分隔。
输入样例:
2 5 4 5 3 -1
输出样例:
5
LinkList MaxP(LinkList L) { LinkList maxp,p; maxp=p=L->next; //定位指针p指向开始结点,并设置开始结点为最大值结点 while(p!=NULL) { if(p->data > maxp->data) //如果p指向的当前结点值大于maxp maxp=p; //记录最大值结点 p=p->next; //后移定位指针p } return maxp; }
a.c: In function ‘main’: a.c:31:11: warning: unused variable ‘e’ [-Wunused-variable] ElemType e; ^ a.c: In function ‘Create’: a.c:46:2: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result] scanf("%d",&e); ^~~~~~~~~~~~~~ a.c:53:3: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result] scanf("%d",&e); ^~~~~~~~~~~~~~
测试点 | 结果 | 测试点得分 | 耗时 | 内存 |
---|---|---|---|---|
0 | 答案正确 | 10 | 3.00 ms | 204 KB |
1 | 答案正确 | 9 | 3.00 ms | 200 KB |
2 | 答案正确 | 6 | 6.00 ms | 204 KB |
本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中偶数值的结点删除。链表结点定义如下:
struct ListNode {
int data;
struct ListNode *next;
};
函数接口定义:
struct ListNode *createlist();
struct ListNode *deleteeven( struct ListNode *head );
函数createlist
从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到时表示输入结束,函数应返回指向单链表头结点的指针。
函数deleteeven
将单链表head
中偶数值的结点删除,返回结果链表的头指针。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int data;
struct ListNode *next;
};
struct ListNode *createlist();
struct ListNode *deleteeven( struct ListNode *head );
void printlist( struct ListNode *head )
{
struct ListNode *p = head;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
struct ListNode *head;
head = createlist();
head = deleteeven(head);
printlist(head);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
1 2 2 3 4 5 6 7 -1
输出样例:
1 3 5 7
struct ListNode *createlist() //尾插入法创建链表 { int i,x; struct ListNode *p,*head; head=(struct ListNode*)malloc(sizeof(struct ListNode)); //创建带头结点的空单链表 p=head; //p定位指针指向最后结点 scanf("%d",&x); //读取第一个元素 while(x!=-1) { p->next=(struct ListNode*)malloc(sizeof(struct ListNode)); //创建新结点插入最后结点后面 p=p->next; //p移动到新尾结点 p->data=x; //数据x存入新结点 scanf("%d",&x); //再读取一个元素值存入x } p->next=NULL; return head->next; //返回创建好的链表第一个结点地址 } struct ListNode *deleteeven(struct ListNode *head) //head链表不带头结点 { struct ListNode *p,*r; //p定位指针,r指向被删的结点 while(head && head->data % 2==0) { //如果当前第一个结点值是偶数,则删除 r=head; head=head->next; free(r); } p=head; //定位p指针指向第一个结点,如果结点存在,则值是奇数 while(p && p->next) { if(p->next->data % 2==0) //如果p的下一个结点值是偶数,则删除 { r=p->next; p->next=r->next; free(r); } else p=p->next; //如果下一个结点是奇数,则p后移 } return head; }
a.c: In function ‘createlist’: a.c:35:9: warning: unused variable ‘i’ [-Wunused-variable] int i,x; ^ a.c:40:5: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result] scanf("%d",&x); //读取第一个元素 ^~~~~~~~~~~~~~ a.c:46:9: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result] scanf("%d",&x); //再读取一个元素值存入x ^~~~~~~~~~~~~~
测试点 | 结果 | 测试点得分 | 耗时 | 内存 |
---|---|---|---|---|
0 | 答案正确 | 10 | 4.00 ms | 384 KB |
1 | 答案正确 | 3 | 3.00 ms | 356 KB |
2 | 答案正确 | 3 | 3.00 ms | 204 KB |
3 | 答案正确 | 3 | 3.00 ms | 324 KB |
4 | 答案正确 | 3 | 3.00 ms | 196 KB |
5 | 答案正确 | 3 | 3.00 ms | 328 KB |
已知一个递增有序链表L(带头结点,元素为整数),编写程序将一个新整数插入到L中,并保持L的有序性。
其中单链表的类型定义参考如下:
typedef int elementType;
typedef struct lnode
{ elementType data;
struct lnode *next;
}Lnode,* LinkList;
输入格式:
输入分三行
第一行 元素个数
第二行 元素的值,元素间用空格分隔。
第三行 待插入的元素值
输出格式:
在一行中输出有序链表元素值,每个元素前输出一个空格以便与相邻元素分隔。
输入样例:
5
1 3 5 7 9
4
输出样例:
1 3 4 5 7 9
#include<stdio.h> #include<stdlib.h> typedef struct LNode{ int data; struct LNode* next; }LNode,*Linklist; //单链表定义 //函数声明如下 Linklist CreateList(); void Insert(Linklist L,int e); void PrintL(Linklist L); int main() { Linklist L=CreateList(); //尾插法创建有序单链表L int e; scanf("%d",&e); //读取待插入的元素e Insert(L,e); //元素e插入到链表L里,保持L有序 PrintL(L); //显示打印链表元素 } Linklist CreateList() //尾插入法创建链表 { int n,i,x; Linklist p; scanf("%d",&n); //读取链表结点个数 Linklist head=(LNode*)malloc(sizeof(LNode)); //创建带头结点的空单链表 p=head; //p定位指针指向最后结点 for(i=1;i<=n;i++) { scanf("%d",&x); //读取一个元素值存入x p->next=(Linklist)malloc(sizeof(LNode)); //创建新结点插入最后结点后面 p=p->next; //p移动到新尾结点 p->data=x; //数据x存入新结点 } p->next=NULL; return head; //返回创建好的链表 } void Insert(Linklist L,int e)//e插入有序链表L,保持链表有序 { Linklist p,q; //p保存待插入结点位置,q保存p的前驱结点 p=L->next; //初始化p指向开始结点 q=L; //初始化q指向头结点 while(p&&p->data <= e) //找到第一个值大于e的结点,插入在该节点之前 { p=p->next; q=q->next; //前驱q,当前p定位指针后移 } Linklist s=(LNode*)malloc(sizeof(LNode)); //创建新结点 s->data=e; s->next=NULL; s->next=p; q->next=s; //新结点插入到p之前,q之后 } void PrintL(Linklist L) //显示打印所有链表元素 { Linklist p=L->next; //p指针指向第一个元素 while(p!=NULL) { printf(" %d",p->data); //打印p指向的元素值 p=p->next; //指针后移 } }
a.c: In function ‘main’: a.c:18:5: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result] scanf("%d",&e); //读取待插入的元素e ^~~~~~~~~~~~~~ a.c: In function ‘CreateList’: a.c:27:5: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result] scanf("%d",&n); //读取链表结点个数 ^~~~~~~~~~~~~~ a.c:32:9: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result] scanf("%d",&x); //读取一个元素值存入x ^~~~~~~~~~~~~~
测试点 | 结果 | 测试点得分 | 耗时 | 内存 |
---|---|---|---|---|
0 | 答案正确 | 10 | 3.00 ms | 316 KB |
1 | 答案正确 | 5 | 2.00 ms | 368 KB |
2 | 答案正确 | 5 | 2.00 ms | 184 KB |
3 | 答案正确 | 5 | 3.00 ms | 328 KB |
4 | 答案正确 | 5 | 3.00 ms | 320 KB |
停留在世界边缘,与之惜别