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;
}









