一、二、三
一、
创建一个双向链表,
将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 ;
}