0724 链表练习

2023-11-03 21:59
文章标签 链表 练习 0724

本文主要是介绍0724 链表练习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.简述Makefile的作用
makefile关系到整个工程的编译规则。Makefile定义了一系列的规则来指定那些文件需要先编译,哪些文件需要后编译
甚至于进行更复杂的功能操作,因为Makefile就像一个shell脚本一样,其中也可以执行操作系统的命令。

2.sizeof与strlen的区别:
sizeof是运算符,他计算的是分配空间的实际字节,而strlen是函数,他计算的是空间中字符的个数;
sizeof可以以类型、函数做参数,而strlen只能以字符串做参数。
sizeof不能计算动态分配空间的大小。

3.什么是野指针?如何避免野指针。
野指针的定义:指向一个已经删除的对象或者未申请访问受限的内存区域的指针
规避:(1)、初始化时置NULL;(2)、释放时置NULL;(3)、使用malloc分配内存

4.c语言分配内存的方式有哪些?
c语言中常见的内存错误有哪些?
内存分配的方式:
(1)、从静态存储区域分配。内存在程序编译的时候就已经分配好了,这块内存在程序整个运行期间都存在,例如全局变量;
(2)、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放,
栈内存分配运算内置于处理器的指令集中,效率高,凡是分配的内存容量有限。
(3)、从堆上分配。也称动态内存分配。有malloc、calloc、realloc和释放函数free。

5.Static全局变量与普通变量的区别?
区别:(1)static全局变量编译使初始化,在main()函数之前初始化并且仅初始化一次
(2)static全局变量限定了作用的范围,仅在定义该变量的源文件中有效,由于静态全局变量的作用域局限于一个源文件内,即
文件作用域,只能为该源文件内的函数公用,因此可以避免在其他源文件中引起错误。全局变量可以跨越多个源文件有效,当然,其他的
不包括全局变量定义的源文件需要用extern关键字再次声明这个全局变量。
Static局部变量与普通局部变量的区别?
(1)static局部变量只被初始化一次,自从第一次被初始化直到程序结束都一直存在。普通局部变量,只在函数被执行期间存在,函数的一次调用
执行结束后,其所占的空间被收回。
(2)静态局部变量在静态存储区分配空间,局部变量在栈里分配空间。
static函数与普通函数的区别?
普通函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他的文件所用。

6.#include <> 和 #include “” 有什么区别?
尖括号表示这个文件是一个工程或标准的头文件,在预处理查找过程中会首先检查系统预定义的目录,如果没有找到就报错

双引号表明这是一个用户自定义的头文件,查找文件的时候会先在当前文件目录中查找,如果没有找到再去系统预定义的目录中查找,如果没有找到就报错。

7.char *const p; char const *p; const char *p 三者的区别。
char *const p 只能改变字符串的内容,不能改地址;
char const *p 只能改地址,但字符串的内容不能改;
const char *p 只能改地址,但不能改内容。

8.写一个 宏MIN,这个宏输入两个参数并返回较小的一个。
另外,当你写下面代码时会发生什么事? least = MIN(*p++,b);
#define MIN(x,y) ((x)<(y) ? (x):(y))
发现输出的是b的值。这是因为集合性的问题,先是p++到了下一个地址,然后显示这个地址的值,而这个地址的值我们没有分配,所以我们未知。

9.找出题中错误,并解释
void test1()
{
char string[10];
char* str1 = “0123456789”
strcpy(string, str1);
}
这题错在strcpy函数的前提是string这个字符型数组的空间要足够大,大到能全部放下str所指的字符串。
10.找出题中错误,并解释
void GetMemory( char *p )
{
p = (char *) malloc( 100 );
}
void Test( void )
{
char *str = NULL;
GetMemory( str );
strcpy( str, “hello world” );
printf("%s", str);
}
这道题错在没有吧str的地址传过去,也就是p没有定义成二级指针,所以这题只是给p分配了空间,而没有给str分配空间。
11: 输入一段字符串,无论是否有重复字母出现,都只打印出现过的小写字母,并按照小写字母顺序打印。
(如输入qewqwr322rqw<>211qESFSSEraZz, 打印aeqrwz)

/*****************************************************
copyright (C), 2014-2015, Lighting Studio. Co.,     Ltd. 
File name:
Author:Jerey_Jobs    Version:0.1    Date: 
Description:
Funcion List: 
*****************************************************/#include <stdio.h>int  Choose(char str[],char ptr[])
{int i = 0;int t = 0;while(str[i] != '\0'){if(str[i] >= 'a' && str[i] <= 'z'){ptr[t] = str[i];t++;i++;}else{i++;}}ptr[t] = '\0';return t;}void Sort(char ptr[100],int t)
{char mtr[100];int m = 0,j = 0,i;char temp;for(j = 0; j < t - 1; j++){m = j;for(i = j + 1; i < t; i++){if(ptr[m] > ptr[i]){m = i;}}if(m != j){temp = ptr[m];ptr[m] = ptr[j];ptr[j] = temp;}}i = 0;j = 0;while(ptr[i] != '\0'){if(ptr[i] == ptr[i+1]){while(ptr[i] == ptr[i+1]){i++;}mtr[j++] = ptr[i];}else{mtr[j++] = ptr[i];}i++;}mtr[j] = '\0';for(i = 0; i < j; i++){printf("%c",mtr[i]);}printf("\n");
}int main()
{char str[100] = "\0";char ptr[100] = "\0";int t;gets(str);t = Choose(str,ptr);Sort(ptr,t);return 0;
}

结果:
在这里插入图片描述
12:输入某个月的第N周和这一周的第M天,通过int *GetDay() 函数获取参数并返回结果,来得出这一天是这个月的第多少天。
(如输入:3,4,即这个月的第3周的第4天,即这个月的第18天)

/*****************************************************
copyright (C), 2014-2015, Lighting Studio. Co.,     Ltd. 
File name:
Author:Jerey_Jobs    Version:0.1    Date: 
Description:
Funcion List: 
*****************************************************/#include <stdio.h>int is_runyear(int year)
{int flag;if((year % 4 == 0 && year % 100 !=0) || year % 400 == 0){flag = 1;}else{flag = 0;}
}int *Get_day(int week,int *day)
{*day = week * 7 - (7 - *day);return day;
}int main()
{int day,week;int flag;printf("Please input the day and week of the month:");scanf("%d%d",&week,&day);day = *Get_day(week,&day);printf("这一天是这个月的第%d天\n",day);return 0;
}结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2019072420562383.png)```
13:(1)建立一个顺序表,要求从键盘输入10个整数,并将该顺序表的元素从屏幕显示出来。(2)用函数实现在顺序表中查找其中一个元素,如果找到,返回该元素在顺序表中的位置和该元素的值,否则提示无此元素。 (3)用函数实现顺序表的插入和删除操作。由用户输入待插入元素及插入位置,将完成插入后的顺序表输出;由用户输入删除第几个元素,将完成删除后的顺序表输出。

/*****************************************************
copyright ©, 2014-2015, Lighting Studio. Co., Ltd.
File name:
Author:Jerey_Jobs Version:0.1 Date:
Description:
Funcion List:
*****************************************************/

#include <stdio.h>

void sort(int a[])
{
int i,j,k;
int temp;

for(i = 0; i < 9; i++)
{k = i;for(j = i + 1; j < 10; j++){if(a[k] > a[j]){k = j;}}if(k != i){temp = a[k];a[k] = a[i];a[i] = temp;}}

}

void search_num(int a[],int n)
{
int i,k;
int flag;
for(i = 0; i < 10; i++)
{
if(n == a[i])
{
flag = 1;
k = i;
}
}

if(flag == 1)
{printf("位置=%d,数值=%d\n",k+1,a[k]);
}
else
{printf("no found!\n");
}

}

void incret_num(int a[],int m,int loc)
{
int b[100];
int i,j = 0;

for(i = 0; i< 10; i++)
{if(loc == i + 1){b[j++] = m;}b[j++] = a[i];
}for(i = 0; i < j; i++)
{printf("%d\n",b[i]);
}

}
void delet_num(int a[],int doc)
{
int i,j = 0;
int c[10];
for(i = 0; i < 10; i++)
{
if(doc == i + 1)
{
i++;
}
c[j++] = a[i];
}

for(i = 0; i < j; i++)
{printf("%d\n",c[i]);
}

}

int main()
{
int a[10];
int i,n;
int m,loc;
int doc;
for(i = 0; i < 10; i++)
{
scanf("%d",&a[i]);
}
printf("\n");
sort(a);

for(i = 0; i < 10; i++)
{printf("%d\n",a[i]);
}
printf("\n");printf("Please input you want to search number:");
scanf("%d",&n);search_num(a,n);
printf("\n");printf("请输入你要插入的元素和位置m,loc:");
scanf("%d%d",&m,&loc);incret_num(a,m,loc);
printf("\n");printf("Please input the dispion of you want to delet:");
scanf("%d",&doc);
delet_num(a,doc);return 0;

}

结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/201907242058075.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzI3MDA4Mg==,size_16,color_FFFFFF,t_70)![在这里插入图片描述](https://img-blog.csdnimg.cn/20190724205836401.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzI3MDA4Mg==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190724205854403.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzI3MDA4Mg==,size_16,color_FFFFFF,t_70)链表练习
1、创立一个链表,要求实现插入节点时,边插边排序(用随机函数生成)

/*****************************************************
copyright ©, 2014-2015, Lighting Studio. Co., Ltd.
File name:
Author:Jerey_Jobs Version:0.1 Date:
Description:
Funcion List:
*****************************************************/

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

typedef struct node Node;
typedef struct node * Link;

struct node
{
int num;

 Link next;

};

void is_malloc_ok(Link new_node)
{
if(new_node == NULL)
{
printf(“malloc error!\n”);

    exit(-1);
}

}

void creat_link(Link *head)
{
*head = NULL;
}

void creat_node(Link *new_node)
{
*new_node = (Link)malloc(sizeof(Node));
is_malloc_ok(*new_node);
}

void incret_node_sort(Link *head,Link new_node)
{
Link p,q;
q = p = *head;

if(*head == NULL)
{*head = new_node;new_node -> next = NULL;
}
else
{if(p -> num > new_node -> num){new_node -> next = p;*head = new_node;}else{while(p != NULL && p -> num < new_node -> num){q = p;p = p -> next;}if(p == NULL){q -> next = new_node;new_node -> next = NULL;}else{q -> next = new_node;new_node -> next = p;}}
}

}

void incret_num(Link *head,Link new_node)
{
Link p,q;
q = p = *head;

if(new_node -> num < (*head) -> num)
{new_node -> next = *head;*head = new_node;
}
else
{while(p != NULL && p -> num < new_node -> num){q = p;p = p -> next;}q -> next = new_node;new_node -> next = p;
}

}

void release_node(Link *head)
{
Link p;
p = *head;
while(*head != NULL)
{
*head = (*head) -> next;
free§;
p = *head;
}
}

void display_node(Link head)
{
Link p;
p = head;

if(head == NULL)
{printf("The node is empty!\n");return;
}while(p != NULL)
{printf("%d\n",p -> num);p = p -> next;
}

}

int main()
{
Link head = NULL;
Link new_node = NULL;

int i;
int m;creat_link(&head);srand((unsigned int) time(NULL));
for(i = 0; i< 10; i++)
{creat_node(&new_node);new_node -> num = rand() % 100;incret_node_sort(&head,new_node);
}display_node(head);
printf("\n");printf("Please input a number for m:\n");
scanf("%d",&m);
creat_node(&new_node);
new_node -> num = m;
incret_num(&head,new_node);
printf("\n");
display_node(head);release_node(&head);
display_node(head);return 0;

}

结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190724210048866.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzI3MDA4Mg==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190724210130147.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzI3MDA4Mg==,size_16,color_FFFFFF,t_70)
2、程序功能:建立一个带有头结点的单向链表,并将存储在数组中的字符依次转储到链表的各个结点中。

/*****************************************************
copyright ©, 2014-2015, Lighting Studio. Co., Ltd.
File name:
Author:Jerey_Jobs Version:0.1 Date:
Description:
Funcion List:
*****************************************************/

#include <stdio.h>
#include <stdlib.h>

typedef struct node Node;
typedef struct node * Link;

struct node
{
char str;

Link next;

};

void creat_link(Link *head)
{
*head = NULL;
}

void is_malloc_ok(Link new_node)
{
if(new_node == NULL)
{
printf(“malloc error!\n”);

    exit(-1);
}

}

void creat_node(Link *new_node)
{
*new_node = (Link)malloc(sizeof(Node));

is_malloc_ok(*new_node);

}

void incret_node(Link *head,Link new_node)
{
Link p,q;
p = q = *head;

if(*head == NULL)
{*head = new_node;new_node -> next = NULL;
}
else
{if(p -> str >= new_node -> str){new_node -> next = p;*head = new_node;}else{while(p != NULL && p -> str < new_node -> str){q = p;p = p -> next;}q -> next = new_node;new_node -> next = p;}
}

}

void release_node(Link *head)
{
Link p;
p = *head;

while(*head != NULL)
{*head = (*head) -> next;free(p);p = *head;
}

}

void display_node(Link head)
{
Link p;

if(head == NULL)
{printf("The node is empty!\n");return;
}while(p != NULL)
{printf("%c\n",p -> str);p = p -> next;
}

}

int main()
{
Link head = NULL;
Link new_node = NULL;
char a[100];
int i = 0;

gets(a);creat_link(&head);while(a[i] != '\0')
{creat_node(&new_node);new_node -> str = a[i];incret_node(&head,new_node);i++;
}
display_node(head);
printf("\n");release_node(&head);
display_node(head);return 0;

}

结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190724210242105.png)
3、编写程序STUDENT *Create(STUDENT studs[],int n)。STUDENT是一个结构类型,包含姓名、成绩和指针域。studs数组中存储了n个STUDENT记录。create函数的功能是根据studs数组建立一个链表,链表中结点按成绩降序排列,函数返回链表头指针。

/*****************************************************
copyright ©, 2014-2015, Lighting Studio. Co., Ltd.
File name:
Author:Jerey_Jobs Version:0.1 Date:
Description:
Funcion List:
*****************************************************/

#include <stdio.h>
#include <stdlib.h>

typedef struct node STUDENT;
typedef struct node * Link;

struct node
{
int score;
char name[10];

Link next;

};

void is_malloc_ok(Link new_node)
{
if(new_node == NULL)
{
printf(“malloc error!\n”);

    exit(-1);
}

}

void creat_link(Link *head)
{
*head = NULL;
}

void creat_node(Link *new_node)
{
*new_node = (Link)malloc(sizeof(STUDENT));
is_malloc_ok(*new_node);
}

void incret_node(Link *head,Link new_node)
{
Link p,q;
q = p = *head;

if(*head == NULL)
{new_node -> next = *head;*head = new_node;
}
else
{if(p -> score <= new_node -> score){new_node -> next = p;*head = new_node;}else{while(p != NULL && p -> score > new_node -> score){q = p;p = p -> next;}q -> next = new_node;new_node -> next = p;}
}

}

void release_node(Link *head)
{
Link p;
p = *head;

while(*head != NULL)
{*head = (*head) -> next;free(p);p = *head;
}

}

void search_score(Link head,int m)
{
Link p;
p = head;
int i = 0;

while(p != NULL && p -> score != m)
{i++;p = p -> next;
}if(p == NULL)
{printf("没有找到!\n");
}
else
{printf("姓名:%s 分数:%3d 名次:%d\n",p -> name,p -> score,i+1);
}

}

void display_node(Link head)
{
Link p;
p = head;
if(head == NULL)
{
printf(“The node is empty!\n”);
return;
}

while(p != NULL)
{printf("分数:%3d   姓名:%s\n",p->score,p -> name);p = p -> next;
}

}

int main()
{
Link head = NULL;
Link new_node = NULL;
int i,n,m;

creat_link(&head);printf("请输入班级有多少学生n:");
scanf("%d",&n);
printf("\n");printf("请输入学生成绩和姓名:");
for(i = 0; i < n; i++)
{creat_node(&new_node);scanf("%d%s",&new_node->score,&new_node->name);incret_node(&head,new_node);
}
printf("\n");
display_node(head);
printf("\n");printf("请输入要查找的分数:");
scanf("%d",&m);
search_score(head,m);release_node(&head);
display_node(head);return 0;

}

结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190724210333608.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzI3MDA4Mg==,size_16,color_FFFFFF,t_70)

这篇关于0724 链表练习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/341133

相关文章

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

RabbitMQ练习(AMQP 0-9-1 Overview)

1、What is AMQP 0-9-1 AMQP 0-9-1(高级消息队列协议)是一种网络协议,它允许遵从该协议的客户端(Publisher或者Consumer)应用程序与遵从该协议的消息中间件代理(Broker,如RabbitMQ)进行通信。 AMQP 0-9-1模型的核心概念包括消息发布者(producers/publisher)、消息(messages)、交换机(exchanges)、

建立升序链表

题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2744 解决:1186 题目描述: 建立一个升序链表并遍历输出。 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。 输出: 可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出。 样例输

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

【Rust练习】12.枚举

练习题来自:https://practice-zh.course.rs/compound-types/enum.html 1 // 修复错误enum Number {Zero,One,Two,}enum Number1 {Zero = 0,One,Two,}// C语言风格的枚举定义enum Number2 {Zero = 0.0,One = 1.0,Two = 2.0,}fn m

MySql 事务练习

事务(transaction) -- 事务 transaction-- 事务是一组操作的集合,是一个不可分割的工作单位,事务会将所有的操作作为一个整体一起向系统提交或撤销请求-- 事务的操作要么同时成功,要么同时失败-- MySql的事务默认是自动提交的,当执行一个DML语句,MySql会立即自动隐式提交事务-- 常见案例:银行转账-- 逻辑:A给B转账1000:1.查询

html css jquery选项卡 代码练习小项目

在学习 html 和 css jquery 结合使用的时候 做好是能尝试做一些简单的小功能,来提高自己的 逻辑能力,熟悉代码的编写语法 下面分享一段代码 使用html css jquery选项卡 代码练习 <div class="box"><dl class="tab"><dd class="active">手机</dd><dd>家电</dd><dd>服装</dd><dd>数码</dd><dd

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图