今天写数据结构的example,定义了3个文件:lish.h list.c main.c

list.h是list.c的头文件,mian.c中对list.h进行了引用。代码如下:

list.h

  1 #ifndef _List_H
2 #define _List_H
3 typedef int ElementType;
4
5 struct Node;
6 typedef struct Node *PtrToNode;
7 typedef PtrToNode List;
8 typedef PtrToNode Position;
9
10 List MakeEmpty();
11 int IsEmpty( List L );
12 int IsLast( Position P, List L );
13 Position Find( ElementType X,List L );
14 void Delete( ElementType X,List L);
15 Position FindPrevious( ElementType X, List L );
16 void Insert( ElementType X, List L, Position P );
17 void DeleteList( List L );
18 //Position Header( List L);
19 //Position First( List L );
20 //Position Advice( Position P);
21 //ElementType Retrieve( Position P);
22
23 #endif /*_List_H*/
24
25
26 /*Place in the Implementation file */
27 struct Node
28 {
29 ElementType Element;
30 Position Next;
31 };

list.c

    #include "list.h"
2 #include <stdlib.h>
3 /*make a empty list,Head pointer to it's head*/
4 List MakeEmpty()
5 {
6 PtrToNode L;
7 L=(struct Node*)malloc(sizeof(struct Node));
8 L->Next = NULL;
9 return L;
10 }
11 /*Return true if L is empty*/
12 int IsEmpty( List L )
13 {
14 return L->Next==NULL;
15 }
16 /*Return true if P is the last position in list L*/
17 int IsLast( Position P, List L )
18 {
19 return P->Next==NULL;
20 }
21 /*Return Position of X in L;NULL if not found*/
22 Position Find( ElementType X,List L )
23 {
24 Position P;
25 P=L->Next;
26 while(P!=NULL&&P->Element!=X)
27 P=P->Next;
28 return P;
29 }
30 /*Delete first occurrence of X from a list*/
31 /*Assume use of a header node*/
32 void Delete( ElementType X, List L )
33 {
34 Position P, TmpCell;
35
36 P = FindPrevious( X, L );
37
38 if( !IsLast( P, L ))
39 {
40 TmpCell = P->Next;
41 P->Next = TmpCell->Next;
42 free( TmpCell );
}
44 }
45 /* If X is not found, then Next field of returned */
46 /* Position id NULL*/
47 /*Assumes a header */
48 Position FindPrevious( ElementType X, List L )
49 {
50 Position P;
51
52 P=L;
53 while( P->Next != NULL && P->Next->Element != X )
54 P = P->Next;
55 return P;
56 }
57 /* Insert (after legal position P) */
58 /* Header implementtation assumed */
59 /* Parameter L is unused in this implementation */
60 void Insert( ElementType X, List L, Position P )
61 {
62 Position TmpCell;
63
64 TmpCell = malloc( sizeof ( struct Node ) );
65 if( TmpCell == NULL)
66 {
67 //printf( "Out of space!!!" );
68 }
69 TmpCell->Element = X;
70 TmpCell->Next = P->Next;
71 P->Next = TmpCell;
72 }
73 /* Correct DeleteList algorithm*/
74 void DeleteList( List L )
75 {
76 Position P, Tmp;
77
78 P = L->Next;
79 L->Next = NULL;
80 while( P != NULL)
81 {
82 Tmp = P->Next;
83 free(P);
84 P=Tmp;
85 }
86 }

main.c

 1 #include <stdio.h>
2 #include "list.h"
3
4 void main()
5 {
6 List L;
7 L=MakeEmpty();
8 //Insert( 10, L, L);
9 Position P;
10 if( !IsEmpty( L ) )
11 {
12 P = L->Next;
13 while( P != NULL )
14 {
15 printf( "%d\n",P->Element);
16 P=P->Next;
17 }
18 printf("Not Empty!\n");
19 }
20 else
21 {
22 printf("Empty!");
23 }
24 }
25

最后,即是利用gcc来编译这几个文件:

gcc -c list.c

gcc -c main.c

gcc main.o list.o -o main

编译后的目标文件即为:main

然后执行:./main 即可
注:被引用的list.h list.c文件要和main.c文件在同一文件夹下,否则要指定路径。

GCC 编译多个文件的更多相关文章

  1. gcc编译时头文件和库文件搜索路径

    特殊情况:用户自定义的头文件使用#include"mylib"时,gcc编译器会从当前目录查找头文件 一.头文件 gcc 在编译时寻找所需要的头文件 :    ※搜寻会从-I开始( ...

  2. linux gcc 编译时头文件和库文件搜索路径

    一.头文件    gcc 在编译时寻找所需要的头文件 :    ※搜寻会从-I开始    ※然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INC ...

  3. 使用当前平台的 gcc 编译内核头文件

    [arm@localhost tchain3.4.4]#cd ${KERNEL} [arm@localhost kernel]#tar xvfz linux­2.6.14.1.tar.gz [arm@ ...

  4. Linux c codeblock的使用(二):在工程中编译多个文件

    (一)前言 我们刚开始学习linux c的时候,一般都是在一个c文件里面写完所有程序,然后用gcc编译这个c文件就好了,十分简单. 但是你有没有想过,如果我们希望将不同模块的代码放到不同的c文件,然后 ...

  5. GCC编译过程与动态链接库和静态链接库

    1. 库的介绍 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可 ...

  6. gcc 编译 + 选项【转】

    转自:http://blog.csdn.net/princess9/article/details/6567678 一般来说要现有项目中的编译选项,设置新的project的编译选项 编译器 就是将“高 ...

  7. Linux下多个.c文件的编译和Makefile文件

    在编程的时候,我们可以把一个完整程序的每个函数分离出来,写成.c文件,最后再一起编译和链接.这样有利于程序功能模块化,也方便检查代码错误. .h文件:里面编辑该程序需要引用的头文件. #ifndef  ...

  8. gcc编译问题

    gcc avl.o hash.o list.o rb.o example.o -o 123.exe 多个.o输出 exe -c和-o都是gcc编译器的可选参数.-c表示只编译(compile)源文件但 ...

  9. gcc 编译 c++ 程序(转载)

    单个源文件生成可执行程序 下面是一个保存在文件 helloworld.cpp 中一个简单的 C++ 程序的代码: /* helloworld.cpp */ #include <iostream& ...

随机推荐

  1. Codility----OddOccurrencesInArray

    Task description A non-empty zero-indexed array A consisting of N integers is given. The array conta ...

  2. 35+个实用jQuery菜单插件

    应用jQuery菜单插件可以让浏览者在浏览你的网页时获得最好的动态导航.jQuery是一个轻量级.跨浏览器的JavaScript框架(库),效果非常给力,它强调并简化了JavaScript.CSS和H ...

  3. shell多线程之进程间通信(3)

    之前的文章依赖是1对1或1多对的,但每个任务的前置任务都只有1个. 本文的核心在于一个任务依赖于多个任务的执行完成,如上图所示,这个任务就是fact,只有new和dviduser两个任务都完成的情况下 ...

  4. ElasticSearch2.3.1环境搭建哪些不为人知的坑

    首先说明一点,大家最好不要用什么尝鲜版,用比稳定版就好了,要不麻烦不断,另外出了问题,最好去官网,或者google搜索,因为这样靠谱些,要不现在好多都是低版本的,1.4的什么的,结果按照安装,多少情况 ...

  5. 浅入深出Vue:数据渲染

    今天来正式开始 vue的学习,首当其冲的当然是数据的渲染.毕竟数据就是拿来看的,看看如果使用 vue来展示数据. 为什么渲染 俗话说 "人靠衣装马靠鞍", 那咱们的代码就是得靠 U ...

  6. linux 环境 安装jdk tomcat mysql git

    1.安装JDK 1.官方下载jdk,linux版本的rpm包 2.安装rz sz ----------编译安装 //安装 cd /tmp wget http://www.ohse.de/uwe/rel ...

  7. 【对象属性复制】BeanUtils.copyProperties(obj1, obj2);

    实现对象的属性值复制,只会复制命名相同的文件. import org.springframework.beans.BeanUtils; BeanUtils.copyProperties(obj1, o ...

  8. C#类成员初始化顺序

    这里直接给出C#类成员一般初始化顺序: 子类静态字段 子类静态构造 子类实例字段 父类静态字段 父类静态构造 父类实例字段 父类实例构造 子类实例构造 为什么说是"一般"初始化顺序 ...

  9. Facebook也炒币吗?Libra币是什么?

    Facebook 在上周发布了加密数字货币,称为 Libra币. 太火爆了,很多人都在关注和讨论,包括一些科技大佬们都很积极的讨论(当然,这里指的是真正的科技大佬,比如 马化腾.王兴等,而不是指哪些割 ...

  10. Docker-Compose搭建单体SkyWalking

    SkyWalking简介 SkyWalking是一款高效的分布式链路追踪框架,对于处理分布式的调用链路的问题定位上有很大帮助 有以下特点: 性能好 针对单实例5000tps的应用,在全量采集的情况下, ...