当前位置: 首页 > news >正文

国庆小练习

一、二、三

一、

创建一个双向链表,
将26个英文字母通过头插的方式插入到链表中
通过尾删的方式将数据读取出来并删除。

main.c

#include <my_head.h>
#include "dblink.h"int main(int argc, const char *argv[])
{dblink *h = create_head();for (char c = 'a'; c <= 'z'; c++){head_insert(h, c);output(h);putchar(10);}for (int i = 'a'; i <= 'z'; i++){printf("%-2c", del_end(h));}putchar(10);return 0;
}

dblink.c

#include "dblink.h"// 创建头结点
dblink *create_head()
{dblink *node = (dblink *)malloc(sizeof(dblink));if (NULL == node){printf("头结点创建失败\t\t\t__%d__\n", __LINE__);return NULL;}node->data = 0;node->front = NULL;node->real = NULL;return node;
}// 创建结点
dblink *create_node(char data)
{dblink *node = (dblink *)malloc(sizeof(dblink));if (NULL == node){printf("结点创建失败\t\t\t__%d__\n", __LINE__);return NULL;}node->data = data;node->front = NULL;node->real = NULL;return node;
}
// 头插
int head_insert(dblink *h, char data)
{if (NULL == h){printf("入参为空\t\t\t__%d__\n", __LINE__);return -1;}dblink *p = create_node(data);p->real = h->real;p->front = h;h->real = p;return 0;
}
// 判空
int is_empty(dblink *h)
{if (NULL == h){printf("入参为空\t\t\t__%d__\n", __LINE__);return -1;}if (NULL == h->real){return 1;}return 0;
}
// 尾删
char del_end(dblink *h)
{if (NULL == h){printf("入参为空\t\t\t__%d__\n", __LINE__);return -1;}if (is_empty(h)){printf("这是个空链表\n");return -1;}dblink *p = h;dblink *q = p->real;if (NULL != q){while (NULL != q->real){p = q;q = p->real;}}p->real = NULL;char c = q->data;free(q);return c;
}// 遍历输出
int output(dblink *h)
{if (NULL == h){printf("入参为空\t\t\t__%d__\n", __LINE__);return -1;}dblink *p = h->real;while (NULL != p){printf("%c  ", p->data);p = p->real;}return 0;
}

dblink.h

#ifndef __DBLINK_H__
#define __DBLINK_H__#include <my_head.h>typedef struct dblinklist
{char data;struct dblinklist *front;   //  头struct dblinklist *real;    //  尾
} dblink;dblink *create_head();
dblink *create_node(char data);
int head_insert(dblink *h, char data);
int is_empty(dblink *h);
char del_end(dblink *h);
int output(dblink *h);#endif

makefile

EXE=dblink
CC=gcc
OBJs+=dblink.o
OBJs+=main.o
CFLAGs=-call:$(EXE)
$(EXE):$(OBJs)$(CC) $^ -o $@
%.o:%.c$(CC) $(CFLAGs) $^ -o $@clean:rm *.o $(EXE)

二、

用自己的代码完成
strcpy strlen strcmp strcat函数的功能实现

main.c

#include <my_head.h>
#include "str.h"
int main(int argc, const char *argv[])
{char s1[128] = "abcde";char s2[128] = "abcdef";printf("strcpy \n%s\n", mystrcpy(s1, s2));printf("strlen \n%ld\n", mystrlen(s1));printf("mystrcmp \n%d\n", mystrcmp(s1, s2));printf("strcat \n%s\n", mystrcat(s1, s2));printf("strlen \n%ld\n", mystrlen(s1));return 0;
}

str.h

#ifndef __DBLINK_H__
#define __DBLINK_H__#include <my_head.h>char *mystrcpy(char *dest, const char *src);
size_t mystrlen(const char *s);
int mystrcmp(const char *s1, const char *s2);
char *mystrcat(char *dest, const char *src);#endif

str.c

#include "str.h"
char *mystrcpy(char *dest, const char *src)
{int i = 0;while (*(dest + i) = *(src + i)){i++;}return dest;
}
size_t mystrlen(const char *s)
{int i = 0;while (*(s + i) != 0){i++;}return i;
}
int mystrcmp(const char *s1, const char *s2)
{int i = 0;while (*(s1 + i) == *(s2 + i) && *(s1 + i) != 0 && *(s2 + i) != 0){i++;}return *(s1 + i) - *(s2 + i);
}
char *mystrcat(char *dest, const char *src)
{int i = 0;char *s1 = dest + mystrlen(dest);while (*(s1++) = *(src + i)){i++;}return dest;
}

makefile

EXE=str
CC=gcc
CFLAGs=-c
OBJs+=main.o
OBJs+=str.oall:$(EXE)
$(EXE):$(OBJs)$(CC) $^ -o $@
%.o:%.c$(CC) $(CFLAGs) $^ -o $@
clean:rm *.o $(EXE)

三、

完成父子进程的通信,
父进程发送一句话后,子进程接收打印
然后子进程发送一句话,父进程接收后打印

main.c

#include <my_head.h>
int main(int argc, const char *argv[])
{// 父发子收if (mkfifo("./FtoS", 0664) < 0){if (errno != 17){ERR_MSG("mkfifo FtoS");return -1;}}printf("mkfifo FtoS success\n");// 子发父收if (mkfifo("./StoF", 0664) < 0){if (errno != 17){ERR_MSG("mkfifo StoF");return -1;}}printf("mkfifo StoF success\n");pid_t cpid = fork();if (cpid < 0){ERR_MSG("fork");return -1;}else if (0 == cpid){// 子进程int StoF = open("./StoF", O_WRONLY);if (StoF < 0){ERR_MSG("open StoF");return -1;}int FtoS = open("./FtoS", O_RDONLY);if (FtoS < 0){ERR_MSG("open FtoS");return -1;}char buff[128] = "";ssize_t res = 0;while (1){bzero(buff, sizeof(buff));// 子收父res = read(FtoS, buff, sizeof(buff));if (res < 0){ERR_MSG("read");return -1;}else if (0 == res){printf("数据读取完毕,且写端关闭\n");break;}printf("父对子说 : %s\n", buff);// 子发父printf("子发父>>>");fgets(buff, sizeof(buff), stdin);buff[strlen(buff) - 1] = 0;if (write(StoF, buff, sizeof(buff)) < 0){ERR_MSG("write");return -1;}printf("子发父成功\n");}}else{// 父进程int StoF = open("./StoF", O_RDONLY);if (StoF < 0){ERR_MSG("open StoF");return -1;}int FtoS = open("./FtoS", O_WRONLY);if (FtoS < 0){ERR_MSG("open FtoS");return -1;}char buff[128] = "";ssize_t res = 0;while (1){// 父发子printf("父发子>>>");fgets(buff, sizeof(buff), stdin);buff[strlen(buff) - 1] = 0;if (write(FtoS, buff, sizeof(buff)) < 0){ERR_MSG("write");return -1;}printf("父发子成功\n");// 父收子bzero(buff, sizeof(buff));res = read(StoF, buff, sizeof(buff));if (res < 0){ERR_MSG("read");return -1;}else if (0 == res){printf("数据读取完毕,且写端关闭\n");break;}printf("子对父说 : %s\n", buff);}}return 0;
}
http://www.lryc.cn/news/180947.html

相关文章:

  • springboot单体项目如何拆分成微服务
  • 解决recovery页面反转的问题
  • 如何使用nuScenes数据集格式的单帧数据推理(以DETR3D为例)
  • 大语言模型之十三 LLama2中文推理
  • iOS AVAudioSession 详解
  • 26-网络通信
  • 嵌入式Linux应用开发-基础知识-第十九章驱动程序基石③
  • 一文拿捏SpringMVC的调用流程
  • 一文详解 JDK1.8 的 Lambda、Stream、LocalDateTime
  • WebSocket实战之二协议分析
  • LeetCode //C - 208. Implement Trie (Prefix Tree)
  • 【Python】time模块和datetime模块的部分函数说明
  • Python 无废话-基础知识元组Tuple详讲
  • 【Win】Microsoft Spy++学习笔记
  • 如何解决版本不兼容Jar包冲突问题
  • 数据结构—归并排序-C语言实现
  • Multiple CORS header ‘Access-Control-Allow-Origin‘ not allowed
  • msvcp100.dll丢失怎样修复,msvcp100.dll丢失问题全面解析
  • 最新AI智能问答系统源码/AI绘画系统源码/支持GPT联网提问/Prompt应用+支持国内AI提问模型
  • 全连接网络实现回归【房价预测的数据】
  • mysql八股
  • MATLAB算法实战应用案例精讲-【优化算法】狐猴优化器(LO)(附MATLAB代码实现)
  • C#WPF动态资源和静态资源应用实例
  • 游戏逆向中的 NoClip 手段和安全应对方式
  • nodejs+vue流浪猫狗救助领养elementui
  • Css Flex 弹性布局中的换行与溢出处理方法
  • linux系统与应用
  • MySQL的结构化语言 DDL DML DQL DCL
  • P5488 差分与前缀和
  • uboot启动流程-uboot内存分配