1 通常情况下,都是0代表成功,负数代表失败,因为成功就一种情况,但失败有很多原因。先不说你只定义了失败没定义成功,单单说你看,你的函数根本就是void返回值的,你准备你的return怎么返回值呢?!
2 永远记得,一个函数最好只干一件事情,内存分配本来就是麻烦活儿,你这样写,如果还有一个相关的函数(比如push_back这种),你是不是要再写一遍呢?如果是C++,这样还会造成无法达到异常安全的问题。所以,内存分配的代码要提出来。当然这个程序就这个函数,这个事情我就不做了。
3 函数行为不统一,你内存分配失败就直接exit了么?退出就退出,可是连个提示都没有?如果是现实中的程序,你觉得用户会在程序莫名其妙地退出以后再去看程序的返回值么?况且现在WIndows的窗口程序根本就不好查看返回值。你这样写,那些最终用户才不管什么,他们认为你的程序莫名其妙就退出了,就是你软件的一个Bug。
4 代码逻辑的划分,是每个函数完成功能的限制的一个依据,你看你的main函数,前面那块是不是可以分出来做成一个SqList_init呢?还可以写一个SqList_input和SqList_print……
5 掉分号,语法错误,结构体成员做形参这些低级错误都不说了,不利用库函数这个也不说了。内存分配里面那块儿我没改,剩下的只是小动了一下,你自己想想然后重新写一个出来吧。
2 永远记得,一个函数最好只干一件事情,内存分配本来就是麻烦活儿,你这样写,如果还有一个相关的函数(比如push_back这种),你是不是要再写一遍呢?如果是C++,这样还会造成无法达到异常安全的问题。所以,内存分配的代码要提出来。当然这个程序就这个函数,这个事情我就不做了。
3 函数行为不统一,你内存分配失败就直接exit了么?退出就退出,可是连个提示都没有?如果是现实中的程序,你觉得用户会在程序莫名其妙地退出以后再去看程序的返回值么?况且现在WIndows的窗口程序根本就不好查看返回值。你这样写,那些最终用户才不管什么,他们认为你的程序莫名其妙就退出了,就是你软件的一个Bug。
4 代码逻辑的划分,是每个函数完成功能的限制的一个依据,你看你的main函数,前面那块是不是可以分出来做成一个SqList_init呢?还可以写一个SqList_input和SqList_print……
5 掉分号,语法错误,结构体成员做形参这些低级错误都不说了,不利用库函数这个也不说了。内存分配里面那块儿我没改,剩下的只是小动了一下,你自己想想然后重新写一个出来吧。
程序代码:
#include<stdio.h> #include<stdlib.h> #define OK 0 #define ERROR -1 #define OVERFLOW -2 #define ENOMEM 12 //定义在errno.h里 #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef struct { int *elem; int length; int size; } SqList; int ListInsert_Sq(SqList* L, int i, int e) { int *p, *q, *newbase; if (i < 1 || i > L->length - 1) return ERROR; if (L->length >= L->size) { newbase = (int *)realloc(L, L->size + LISTINCREMENT * sizeof(int)); if (!newbase) exit(OVERFLOW); L->elem = newbase; L->size += LISTINCREMENT; } q = &(L->elem[i-1]); for (p = &(L->elem[L->length-1]); p >= q; --p) *(p + 1) = *p; *q = e; ++L->length; return OK; } int main() { SqList L; int i, l, e; L.elem = (int*)malloc(LIST_INIT_SIZE * sizeof(int)); if (!L.elem) exit(OVERFLOW); L.length = 10; L.size = LIST_INIT_SIZE; printf("Enter elememt: \n"); for (i = 0; i < L.length; i++) { scanf("%d", &L.elem[i]); } printf("Enter l: \n"); scanf("%d", &l); printf("Enter e: \n"); scanf("%d", &e); ListInsert_Sq(&L, l, e); for (i = 0; i < L.length; i++) { printf("%d", L.elem[i]); } return 0; }