Your system("cls"); only works in Windows and DOS. Instead, you could use CSI codes (ANSI escape codes). The CSI in the list is simply the string "\033[", so to for example clear the screen you can use
Code:
    printf("\033[H\033[2J"); /* Move cursor to upper left corner, then clear the screen. */
For a text-mode editor, the ncurses library provides a lot of useful features, like automatic screen (terminal) size detection and so on. On Windows, pdcurses or win32a should do fine.

As to the data structures, I'd define a dynamic string type (with a end-of-line type flag). Perhaps
Code:
struct line {
    size_t        size;  /* Bytes allocated */
    size_t        used;  /* Bytes used */
    unsigned char newline;
    unsigned char data[];
};

struct document {
    size_t        size;  /* Lines allocated */
    size_t        used;  /* Lines used */
    struct line  *line[];
};

struct document *document_load(const char *const filename);
int document_save(const struct document *const doc, const char *const filename);
int document_insert(struct document *const doc, const size_t before_line, struct line *const line);
int document_delete(struct document *const doc, const size_t line);

int line_free(struct line *const line);
struct line *line_new(const unsigned char *const from, const size_t length);
struct line *line_grow(struct line *const line, const size_t minimum);
struct line *line_copy(const struct line *const line);
When inserting or deleting lines, only the pointers need to be updated. When appending a line, the struct line can be reallocated when necessary, so it can be grown longer. The line_ helper functions would allow you to manipulate the contents of a line as you wish.

The reason for the newline constant for each line is that if you include it in the string itself, it will make your line editing and display functions overly complicated. Also, if instead of an actual character it is a constant, you can support different newline conventions without issues. (One of my pet peeves is how many editors mangle and get confused about newline conventions. I'd want an editor that supports NUL ('\0'), LF ('\n'), CR ('\r'), LF CR ("\r\n"), and CR LF ("\n\r") without me having to do anything about it.)

It would be even better to use wchar_t data[]; in the struct line, so each element in that array would correspond to a glyph (character) in the user's locale. (For example, € takes nowadays three chars, if you are using the UTF-8 character set as you should. "But I don't want to bother" is a poor excuse for mangling peoples names, for example.)

Is there anything specific you want to ask?