Bubble Sort in C: Array vs Linked List
Things you did well


You initialize your variables when you declared them.
You initialize variables inside of your for loops.(C99)
Your pointer arithmetic looks pretty sound.


Things you can improve

Efficiency/Algorithm


Unfortunately, bubble sort is not a very good sorting algorithm if you are looking for speed.  Its average case performance is \$ O\left(n^{2}\right) \$.
If you are looking into greater speed with your sorting function, look at a quicksort algorithm.  Its average case performance is \$ O\left( n \log n \right) \$.


User experience


Is shutting down the program really necessary when your linked list doesn't actually exist, or that the size of your array is less than one?  Do something more useful than assert(), and return a specific error code that you can handle later on in your code.  This will greatly help you in debugging too.


Makefile


Makefile variables - Right now your Makefile isn't very expandable.  Variables help out a lot with that.


Put your compiler names into variables.

CXX = g++
CC = gcc


This is something I like to do, however, some variables like CC are declared already, so you generally don't need to.
Put your final executable into a variable name.

EXECUTABLE = bubble

Put your sources into a variable name.

SOURCES = bubble.c

Put your objects into a variable name.

OBJECTS = $(SOURCES:.c=.o)

.c.o:
    $(CC) $(CFLAGS) -o $@ $&lt;

All of your compiler flags should be in one variable.  And tack on a linker flag variable while we are at it, for futures sake.

CFLAGS = -std=c99 -Wall
LDFLAGS =

Calling the variables is now a lot more easy and flexible.

all: $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(LDFLAGS) -o $@ $&lt;


Compiler flags - get the most out of your compiler so that you can code better.


You should change the standards you are using to C11 with --std=c11
-g adds symbols for debugging.  Without it, your debugger won't be able to give you variable or function names.  The don't slow down the program, and we don't care if the program is a kilobyte larger, so there's little reason to not use this.
-O3 indicated optimization level three, which tries every trick known to build faster code.  If, when you run the debugger, you find that too many variables have been optimized out for you to follow what's going on, then change this to -O0.


If you want to go above and beyond, here are all of the compiler flags I use.

CFLAGS = -std=gnu11 -c -s -O3 -Werror -Wall -Wextra -Wformat=2 -Winit-self -Wswitch-enum -Wstrict-aliasing=2 -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wwrite-strings -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wnested-externs -Winline -Wdisabled-optimization -Wunused-macros -Wno-unused



Standards


You don't have to return 0 at the end of main(), just like you wouldn't bother putting return; at the end of a void-returning function. The C standard  knows how frequently this is used, and lets you not bother.


  C99 &amp; C11 §5.1.2.2(3)
  
  ...reaching the } that terminates the main() function returns a
  value of 0.



Syntax/Styling


Use Yoda conditions to prevent future bugs.

if (0 == sorted)


Placing the constant value in the expression does not change the behavior of the program. A common mistake is to accidentally assign a value instead of writing a conditional statement.  Using Yoda conditions will throw a syntax error if you accidentally do that, so your code won't compile.
You should return some status indicators from your sorting functions, so we can check that the sorting went okay.  This also makes for easier debugging.
You can simplify some of your test conditionals


if (sorted == 0)



That is actually harder for me to understand over my version.

if (!sorted)


If I were to read my version out loud, it would read "if not sorted", whereas your version is "if sorted is equal to 0".  It's odd, since you have this in one place, but not the other (always be consistent).
Declare your method parameters as void if you don't take any arguments in.

int main(void)