| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 867 人关注过本帖
标题:请教一个问题(插入排序)
只看楼主 加入收藏
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
1 通常情况下,都是0代表成功,负数代表失败,因为成功就一种情况,但失败有很多原因。先不说你只定义了失败没定义成功,单单说你看,你的函数根本就是void返回值的,你准备你的return怎么返回值呢?!
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;
}


专心编程………
飞燕算法初级群:3996098
我的Blog
2008-10-16 10:01
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
收藏
得分:0 
学习了好多东西啊

谢谢了!
StarWing83

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-10-16 10:05
aofengyu
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2008-10-16
收藏
得分:0 
菜鸟一个,进来顶顶
2008-10-16 10:12
快速回复:请教一个问题(插入排序)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024600 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved