Linux 下真實的C項目設計
文件目錄說明
- include 存放自己設計的.h頭文件之所在
- include/stack.h 棧所使用的頭文件。文件中已經定義出其包含的功能函數。具體請查看文件註釋
- stack.c 棧的功能函數的實現文件。目前爲空文件。
- main.c 一個簡單的主程序,調用自定義棧的功能測試入棧、出棧的功能。
- Makefile make的控制文件。
實現Makefile
- 實現make命令完成所有編譯、鏈接工作
- 實現make clean命令可以恢復代碼爲原始狀態
運行結果
在windows下打開linux shell:
編譯+鏈接,make一步到位(圖中標號給出了文件生成的順序):
main:main.o my_stack.o
gcc main.o my_stack.o -o main
main.o:main.c
gcc -c main.c
my_stack.o:my_stack.c
gcc -c my_stack.c
clean:
if [ -e main ] ; then rm main ; fi
if [ -n "ls *.o >/dev/null 2>&1" ] ; then rm *.o ; fi
make main 操作完成編譯+鏈接
main.o 獲得可執行文件main.o
my_stack.o 獲得可執行文件mystack.o
make clean 操作刪除所有已經編譯的.o文件和main最終文件
接着來看main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "include/stack.h"
int main()
{
//測試手寫的封裝棧
stack_clear();//初始化棧
srand((unsigned)time(NULL));
elem buf;
for(int i=0;i<10;i++)
{
buf = rand()%100;
stack_push(buf);
printf("當前棧頂元素爲:%d\n",stack_top());
printf("棧是否爲空(0爲不空,1爲空):%d\n",stack_empty());
printf("當前棧的大小爲:%d\n",stack_size());
}
return 0;
}
main.c這部分代碼是測試自己手寫的封裝棧,首先先初始化棧,接着for循環生成10個隨機數,緊接着每次打印棧頂元素和棧的大小,順帶判斷棧是否爲空
再來看my_stack.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "./include/stack.h"
Stack stack; //爲了方便這裏直接定義全局變量了,用局部變量的話在每個函數加上取地址符和聲明就行了
void stack_pop(){ //元素出棧,此函數無返回值
stack.top--;
}
void stack_push(elem buf){ //元素入棧
stack.index[++stack.top] = buf;
}
int stack_empty(){//判空,如果棧爲空的話返回1,否則返回0
return stack.top == -1;
}
void stack_clear(){ ///清空棧
stack.top = -1;
}
int stack_size(){ //求棧內元素數
return stack.top+1;
}
elem stack_top(){ //返回棧頂元素
return stack.index[stack.top];
}
my_stack.c是棧功能的實現函數,具體的實現內容則是根據大二上數據結構課程所學,這裏就不再贅述
include 文件夾下 stack.h存放的則是一些預定義函數
#ifndef STACK_H_
#define STACK_H_
#define maxn 110//棧的最大值
typedef int elem;//方便修改數據類型
typedef struct
{
int top; //棧頂的索引
elem index[maxn];
}Stack;
void stack_pop(); //元素出棧,此函數無返回值
void stack_push(elem buf);//元素入棧
int stack_empty();//判空,如果棧爲空的話返回1,否則返回0
void stack_clear();///清空棧
int stack_size(); //求棧內元素數
elem stack_top(); //返回棧頂元素
#endif
我們接着來看一下運行結果:
可以看到自己手寫的棧功能運行正常,還沒有出現大的bug~
測試一下make clean:
文件夾中的main main.o 已經stack.o都被刪除了,makefile運行正常