/src/inpu.c
#include#include NODE *g_index_stu; NODE *g_stu; int g_index=0; int Stu_num_init(int flag_mode) { NODE *stu_index_tmp = Creat_Stu_Num(); g_stu = Creat_Stu_Num(); g_index_stu =stu_index_tmp; g_index_stu->next = g_stu; g_index_stu ->head = g_index_stu; //头节点等于当前指针 g_index_stu ->previous = g_index_stu ; //上一个节点为空 g_index_stu->index=g_index++; g_index_stu->student=NULL; student_t *i_student = Creat_Student(); g_stu->student = i_student; g_stu->previous = g_index_stu; g_stu->head = g_index_stu; g_stu->next = NULL; return RET_ZER; } NODE *Get_G_Stu(G_Stu_Flag tmp_stu_falg) { if(tmp_stu_falg >= G_STU_MAX) return NULL; switch (tmp_stu_falg) { case G_STU: return g_stu; case G_STU_INDEX: return g_index_stu; default: return NULL; } } student_t* Creat_Student() { student_t *p_tmp_student = (student_t *)malloc(sizeof(struct student)); memset(p_tmp_student,0,sizeof(struct student)); //清0 if (p_tmp_student == NULL) { printf("p_tmp_student error!"); exit(RET_ERR); } return p_tmp_student; } NODE* Creat_Stu_Num() { NODE *stu_num_tmp = (NODE *)malloc(sizeof(struct stu_num)); memset(stu_num_tmp,0,sizeof(struct stu_num)); //清0 if (stu_num_tmp == NULL) { printf("stu_num_tmp error!"); exit(RET_ERR); } return stu_num_tmp; } int Input_add_student_info(NODE **stu) { point_stu_shift(); NODE *stu_tmp = *stu; char tmp_name[student_name_max_length]; int tmp_num; int tmp_class; int8_t tmp_sex; printf("Please input student info :n"); printf("name:t"); scanf("%s",tmp_name); printf("num :t"); scanf("%d",&tmp_num); printf("class:t"); scanf("%d",&tmp_class); printf("index:t"); scanf("%hhd",&tmp_sex); point_stu_shift(); stu_tmp->index=g_index++; strncpy(stu_tmp->student->name,tmp_name,sizeof(tmp_name)); stu_tmp->student->num=tmp_num; stu_tmp->student->class=tmp_class; stu_tmp->student->sex=tmp_sex; #if DEBUG printf("g_index:%dnn",g_index-1); #endif CTC_FUN_RTUNCE(Insert_student_tail(stu_tmp)); } int Input_remove_student_by_index() { int tmp_index; printf("Please input remove student by index: n"); printf("index:t"); scanf("%d",&tmp_index); CTC_FUN_RTUNCE(Delte_student_from_index(tmp_index)); return RET_ZER; } int Insert_student_tail(NODE *stu) { printf("Insert_studentrn"); if(stu==NULL) return RET_ERR; #if DEBUG printf(" %d t %s t %d t %d t %d n", stu->index,stu->student->name,stu->student->num,stu->student->class,stu->student->sex); #endif g_stu->index = stu ->index; g_stu->count++; g_stu->student->num = stu->student->num; g_stu->student->class = stu->student->class; g_stu->student->sex = stu ->student ->sex; strncpy(g_stu->student->name,stu->student->name,sizeof(stu->student->name)); return RET_ZER; } int Delte_student_from_index(int tmp_index) { if(tmp_index>=g_index || tmp_index <0) { printf("No search index:%d",tmp_index); return RET_ERR; } NODE *p_before_tmp=NULL; NODE *p_after_tmp =NULL; NODE *stu_tmp=NULL; stu_tmp=Get_G_Stu(G_STU_INDEX); //获取头节点 while(stu_tmp!=NULL) { if(tmp_index == stu_tmp->index && tmp_index>0) { if(stu_tmp->next==NULL) { p_before_tmp=stu_tmp->previous; p_before_tmp->next=NULL; free(stu_tmp); return RET_ZER; } else if(stu_tmp->next!=NULL) { p_before_tmp=stu_tmp->previous; p_after_tmp=stu_tmp->next; p_before_tmp->next=p_after_tmp; p_after_tmp->previous=p_before_tmp; free(stu_tmp); return RET_ZER; }else{ printf("Delte_student ERRrn"); return RET_ERR; } } stu_tmp=stu_tmp->next; } return RET_ZER; } int Printf_stu_all() { NODE *tmp_g_stu; tmp_g_stu =Get_G_Stu(G_STU_INDEX); if(tmp_g_stu==NULL) return RET_ERR; else { printf("index t name t num t class t sex rn"); while(tmp_g_stu!=NULL) { if(tmp_g_stu->student!=NULL) { printf("%03d t %s t %d t %d t %s rn ", tmp_g_stu->index,tmp_g_stu->student->name,tmp_g_stu->student->num,tmp_g_stu->student->class,tmp_g_stu->student->sex?"man":"woman"); } if(tmp_g_stu->next!=NULL) tmp_g_stu =(NODE *)tmp_g_stu->next; else break; } } return RET_ZER ; } void point_stu_shift() { void *tmp_stu; tmp_stu=g_stu; g_stu ->next = Creat_Stu_Num(); g_stu =(NODE *)g_stu->next; g_stu ->previous = (NODE *)tmp_stu; g_stu->student =Creat_Student(); g_stu ->next =NULL; } int main(int argc, char const *argv[]) { #if 0 CTC_FUN_RTUNCE(Stu_num_init(1)); NODE *stu_tmp = Creat_Stu_Num(); student_t *p_tmp_student =Creat_Student(); stu_tmp->student = p_tmp_student; Input_add_student_info(&stu_tmp); CTC_FUN_RTUNCE(Printf_stu_all()); Input_add_student_info(&stu_tmp); Input_add_student_info(&stu_tmp); CTC_FUN_RTUNCE(Printf_stu_all()); Input_add_student_info(&stu_tmp); CTC_FUN_RTUNCE(Printf_stu_all()); CTC_FUN_RTUNCE(Input_remove_student_by_index()); CTC_FUN_RTUNCE(Printf_stu_all()); Input_add_student_info(&stu_tmp); CTC_FUN_RTUNCE(Printf_stu_all()); #endif test(); return 0; } int fun1(int a) { printf("fun1 !!! n "); return a+1; } int* fun2 (int *a) { int b=11; int *p ; p=&b; printf("fun2 !!! *a:%d n",*a); return p; } void fun3 (int a) { printf("fun3 !!! a:%d n",a+100); } void test() { int ret= t_get_time(11); printf("ret :%d n ",ret); #ifdef _MACRO printf("Hello , How are you?n"); #else printf("Sorry to lost you. n"); #endif typedef int (* fun)(int ); typedef int *opera(int * ); typedef void work(int ); int *p,p_a; p_a=35; p=&p_a; #if 0 fun f1=&fun1; #else fun f1=fun1; #endif ret = f1(33); printf("ret1: %d n",ret); opera *f2 = &fun2; p = f2(p); work *f3 = &fun3; f3(1); }
/src/out.c
#includestatic int change_time_day(int day) { int ret_num=day+1; return ret_num; } int t_get_time(int day) { return change_time_day(day); }
include/inpu.h
#ifndef _STU_IN_PRO_ #define _STU_IN_PRO_ #include#include #include #include #include #include #include #include #include #endif #define CTC_FUN_RTUNCE(fun) do{ int ctc_ret =(fun); if(ctc_ret<0) { printf("ERROR! ret:%d n",ctc_ret); return ctc_ret; } }while(0) #define DEBUG 0 #define RET_ONE 1 #define RET_ZER 0 #define RET_ERR -1 #define student_name_max_length 10 typedef void *my_oper(int ); typedef int (*p_fun)(int ); int fun_a ; struct time{ int year; int month; int day; }; struct student{ int num; //学号 int class; //班级 int8_t sex; char name[student_name_max_length]; //性别 struct time birth; struct time register_sc; void (*my_fun)(int ); }; typedef struct student student_t; struct stu_num{ int index; //结构体索引 void *head; //头节点 void *next; //指向下一个节点 void *previous; //上一个节点 struct student *student; //数据 int count; //数量 }; typedef struct stu_num NODE; enum G_STU_FLAG { G_STU, G_STU_INDEX, G_STU_MAX }; typedef enum G_STU_FLAG G_Stu_Flag ; void test(); int Stu_num_init(int ); NODE *Get_G_Stu(G_Stu_Flag); NODE* Creat_Stu_Num(); student_t *Creat_Student(); int Input_remove_student_by_index(); int Delte_student_from_index(int ); int Input_add_student_info(NODE **); int Insert_student_tail(NODE * ); int Printf_stu_all(); void point_stu_shift();
include/out.h
#ifndef _STU_OUT_PRO_ #define _STU_OUT_PRO_ #include#include #define STU_SUM_NUM_OUT 58 #endif static int change_time_day(int ); int t_get_time(int ); //int main(int argc, char const *argv[]);
Makefile
VERSION = 1.0 PRO_STU_DIR :=$(shell pwd) TARGET_1 = app TARGET = $(TARGET_1).$(VERSION) CC := gcc SOURCE = $(wildcard $(PRO_STU_DIR)/src/*.c) #获取src目录下的所有的.c文件 File = $(notdir $(SOURCE)) # 去除路径 SRC_PATH = $(PRO_STU_DIR)/src OBJ = $(patsubst %.c, %.o, $(SOURCE)) #.c 转为 .o OBJ_PATH = $(PRO_STU_DIR)/obj INCLUDE_PS = $(wildcard $(PRO_STU_DIR)/include/*.h) #获取src目录下的所有的.c文件 INCLUDE_PATH = -I $(PRO_STU_DIR)/include/ DHDEFINE = -D_MACRO #宏定义 CFLAGS = -Werror #编译标志位 #CFLAGS = -Wno-strict-aliasing #屏蔽gcc 编译报出的waring 信息 #CFLAGS = -w GCC_OBJ_PATH := $(patsubst %.c,$(OBJ_PATH)/%.o, $(notdir $(SOURCE))) OBJ_OD_PATH := $(patsubst %.c, $(OBJ_PATH)/.%.o.d,$(notdir $(SOURCE))) OBJ_OD_PATH := $(wildcard $(OBJ_OD_PATH)) #@$(PRO_STU_DIR)/out/$@ 执行目标文件 $(TARGET):$(GCC_OBJ_PATH) @$(CC) $(GCC_OBJ_PATH) -o ./out/$(TARGET) ifneq ($(OBJ_OD_PATH), ) include $(OBJ_OD_PATH) endif $(OBJ_PATH)/%.o : $(SRC_PATH)/%.c @$(CC) -c -g $< -o $@ -MD -MF $(OBJ_PATH)/.$(notdir $@).d $(CFLAGS) $(INCLUDE_PATH) $(DHDEFINE) .PHONY:clean clean: rm -rf $(PRO_STU_DIR)/obj/* distclean: @rm -rf $(PRO_STU_DIR)/obj/* @rm -rf $(OBJ_OD_PATH) @rm -rf $(PRO_STU_DIR)/out/*



