主题:求助!严蔚敏 数据结构题集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)?");]这一句就终止了。
#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)?");]这一句就终止了。