回 帖 发 新 帖 刷新版面

主题:求助!严蔚敏 数据结构题集16页2.10

//本程序实现删除顺序线性表中第i个元素起的k个元素
#include <stdlib.h>
#include <stdio.h>
//本章涉及的顺序表和线性链表的类型定义如下:
#define ERROR 0
#define OK 1
#define OVERFLOW -2
#define INFEASIBLE -1
typedef int ElemType;
typedef int status;

#define LIST_INIT_SIZE 10 //线性表存储空间的初始分配量
#define LISTINCREMENT 5 //线性表存储空间的分配增量

typedef struct{
    ElemType *elem;//存储空间的基址
    int length;//当前长度
    int listsize;//当前分配的存储容量(以sizeof(ElemType)为单位
}SqList;

//*********************************************************
status InitList_Sq(SqList &L){
    //构造一个空的线性表L
    if(!(L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)))) exit(OVERFLOW);
    L.length=0;
    L.listsize=LIST_INIT_SIZE;
    return OK;
}

//************以下是线性表的输入和显示************************
status build_Sq(SqList &L){
    //如果线性表为空,则从左到右输入顺序线性表数据。
    ElemType *p;
    p=L.elem;
    int temp;
    if(L.length==0){    
        printf("请输入顺序线性表数据(输入0结束输入)\n");
        scanf("%d",&temp);
        while(temp!=0){
            if(L.length==L.listsize){ 
                //如果长度超限,则动态增加LISTINCREMENT长度
                L.elem=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
                if(!L.elem) exit(OVERFLOW);
                L.listsize+=LISTINCREMENT;
                p=L.elem+L.length;    //p指向L的最后一个结点的后续。
            }
            *p++=temp; L.length++; temp=0;
            scanf("%d",&temp);
        }
        return OK;
    }
    else return ERROR;
}

void show_Sq(SqList &L){
    //显示线性表
    int i;
    ElemType *p;
    printf("\n顺序线性表,长度为:%d,容量:%d\t*****************\n",L.length,L.listsize);
    p=L.elem;
    if(L.length==0)
        printf("线性表为空\n");
    else
        for(i=1;i<=L.length;i++){
            printf("结点%d:[%d]\t-->",i,*p++);
            if(i%4==0) printf("\n");                    //控制一行输出4个结点。
        }
    printf("\n******************************************************\n");
}
//************以上是线性表的输入和显示************************


status DeleteK(SqList &a,int i,int k){
    //本过程从顺序存储结构的线性表a中删除第i个元素起的k个元素
    if(i<1||k<0||i+k-1>a.length) return INFEASIBLE; //参数不合法,原题条件i+k>a.length改为i+k-1>a.length
    else{    //原题此处多了{
        while(i+k<=a.length){
            a.elem[i-1]=a.elem[i+k-1];i++;
        }
        a.length-=k;
    }
    return OK;
}

void main(){
    char c;
    int i,k;
    
    SqList L;
    if(!InitList_Sq(L)) printf("\n构造一个空的线性表失败!\n");
    if(!build_Sq(L)) printf("\n输入顺序线性表数据失败!\n");
    printf("\n原线性表数据为:");
    show_Sq(L);
    do{
        printf("从第几个元素开始删除?");
        scanf("%d",&i);
        printf("删除几个元素?");
        scanf("%d",&k);
        if(!DeleteK(L,i,k)) printf("\n删除参数不合法\n");
        printf("\n操作后的线性表数据为:");
        show_Sq(L);
        printf("是否继续操作(Y,N)?");
        c=getchar();                       [color=800080]//此处为何不执行?[/color]
    }while(c=='Y'||c=='y');
}

-----------------------------------------------------------
    我是在VC中执行这段程序的,大体上没问题,但main()的紫色部分(c=getchar(); )为何不执行了呢?总是执行到[printf("是否继续操作(Y,N)?");]这一句就终止了。

回复列表 (共3个回复)

沙发

有可能是输入缓存没有清空,可以手动清空,好像是flush(),具体用法不知道,可以到C/C++那问一下。
如果数据结构部分代码有问题,我有时间了帮你测试一下。

板凳


谢了,我发到C/C++那里看看吧。

3 楼

“在c=getchar();前面加上一句getchar();就可以了
原因分析:如果你在上一次输入时(系统提示“删除几个元素?”)“1+回车”
此时你敲击回车被c=getchar();捕获,所以你不应该说没有执行到这一句
要想实现你的要求的功能,只要提前捕获这个回车信息就可以了”

原来是这样。

我来回复

您尚未登录,请登录后再回复。点此登录或注册