主题:关于线性表顺序的现实?
pretty
[专家分:70] 发布于 2008-03-31 13:44:00
如果我定义了以下的数据类型,
typedef struct{
char a[10];
int b[10];
char c[10];
int d[10];
int e[10];
float f[10];
}ElemType;
typedef struct{
ElemType *elem;
int length;
int listsize;
}SqList;
完成以下操作.
//线性表L已存在,若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义.
Status PriorElem(SqList *L,ElemType cur_e,ElemType pre_e){
//假如:ElemType定义为int型,SqList分配了4个元素,元素内容分别是:2,7,5,9.
//主调函数给cur_e传过来一个5,通过依次比较到第三个元素5时会返回他的前驱元素7,
//如果ElemType定义为结构体.
//如何判断线性表L中存在cur_e元素?用cur_e的成员和线性表中的每个元素中成员做比较吗?
}
回复列表 (共3个回复)
沙发
pretty [专家分:70] 发布于 2008-03-31 17:58:00
下面是源程序,写了一部分,写不下去了,不知道怎么写,请赐教.
自己顶一下.
#include<stdio.h>
#include<stdlib.h>
#define INFEASIBLE -1 //线性表不存在
#define OVERFLOW -2 //线性表存储空间分配失败
#define FALSE 0
#define TRUE 1
#define ERROR 0
#define OK 1 //函数执行成功
#define NULL 0
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
typedef int Status;
typedef struct{
ElemType *elem;
int length;
int listsize;
}SqList;
int main(){
Status InitList(SqList *);
Status DestroyList(SqList *);
Status ClearList(SqList *);
Status ListEmpty(SqList *);
Status ListLength(SqList *);
Status GetElem(SqList *,int,Elemtype *);
//Status LocateElem();
//Status PriorElem();
//Status NextElem();
//Status ListInsert();
//Status ListDelete();
//Status ListTraverse();
}
//构造一个空的线性表L.
Status InitList(SqList *L){
L->elem =(ElemType *) malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L->elem)
return OVERFLOW;
L->length =0;
L->listsize =LIST_INIT_SIZE;
return OK;
}
//线性表L存在,销毁线性表L.
Status DestroyList(SqList *L){
if(!L->elem)
return INFEASIBLE;
free(L->elem);
L->elem=NULL;
return OK;
}
//线性表L已存在,将L重置为空表.
Status ClearList(SqList *L){
if(!L->elem)
return INFEASIBLE;
L->length=0;
return OK;
}
//线性表L已存在,若L为空表,则返回TRUE,否则返回FALSE.
Status ListEmpty(SqList *L){
if(!L->elem)
return INFEASIBLE;
if(!L->length)
return TRUE;
else
return FALSE;
}
//线性表L已存在,返回L中数据元素个数.
Status ListLength(SqList *L){
if(!L->elem)
return INFEASIBLE;
return L->length;
}
//线性表L已存在,1<=i<=ListLength(L),用e返回L中第i个数据元素的值.
Status GetElem(SqList *L,int i,ElemType *e){
if(!L->elem)
return INFEASIBLE;
if(i < 1 && i > L->length)
return ERROR;
*e=L->elem[i];
}
//线性表L已存在,compare()是数据元素判定函数,返回L中第1个与e满足关系compare()的数据元素的位序.
//若这样的数据元素不存在,则返回值为0.
Status LocateElem(SqList *L,){
;
}
//线性表L已存在,若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义.
Status PriorElem(SqList *L,ElemType cur_e,ElemType pre_e){
if(!L->elem)
return INFEASIBLE;
;
}
/*
//线性表L已存在,若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作失败,next_e无定义.
Status NextElem(){
;
}
//线性表L已存在,1<=i<=ListLength(L)+1.在L中第i个位置之前插入新的数据元素e,L的长度加1.
Status ListInsert(){
;
}
//线性表L已存在且非空,1<=i<=ListLength(L),删除L的第i个数据元素,并用e返回其值,L的长度减1.
Status ListDelete(){
;
}
//线性表L已存在,依次对L的每个数据元素调用函数visit().一旦visit()失败,则操作失败.
Status ListTraverse(){
;
}
*/
板凳
27046662 [专家分:210] 发布于 2008-04-01 15:13:00
#include "stdio.h"
#include "stdlib.h"
#define MAXSIZE 100
#define OK 1
#define ERROR 0
typedef int Status;
typedef int Elemtype;
typedef struct
{
Elemtype data[MAXSIZE];
int length;
}seqlist;
int main(void)
{
Status crelist(seqlist *L,int n);
Status inslist(seqlist *L,int n);
Status dellist(seqlist *L);
int i=0;
int m=0;
seqlist *L,a;
L=&a;
printf("Input seqlist length :\n");
scanf("%d",&i);
L->length=i;
crelist(L,i);
printf("\nPlease input inverst the place: \n");
scanf("%d",&m);
inslist(L,m);
dellist(L);
system("pause");
return 0;
}
Status crelist(seqlist *L,int n)
{
int m=0;
for(;m<n;m++)
scanf("%d",&L->data[m]);
for(m=0;m<n;m++)
printf("%d ",L->data[m]);
return OK;
}
Status inslist(seqlist *L,int n)
{
int m=0,i=0,flag=1;
if(n>L->length+1||n<1)
return ERROR;
printf("input want inverst the number:\n");
scanf("%d",&m);
for(i=L->length;i>=n;--i)
L->data[i+1]=L->data[i];
flag=0;
L->data[n]=m;
++L->length;
printf("the new seqlist is :\n");
for(m=0;m<L->length;m++)
printf("%d ",L->data[m]);
return OK;
}
Status dellist(seqlist *L)
{
int i=0;
printf("\nwhich the number delete:\n");
scanf("%d",&i);
if(i>L->length||i<1)
return ERROR;
for(i;i<L->length;i++)
L->data[i-1]=L->data[i];
--L->length;
printf("the new seqlist is :\n");
for(i=0;i<L->length;i++)
printf("%d ",L->data[i]);
return OK;
}
很久以前写的 你参考下..~
3 楼
pretty [专家分:70] 发布于 2008-04-04 13:40:00
非常感谢你的源程序.在这个程序中发现了一些小问题,希望你改一下吧.
当执行到这个函数时,L->length长度假设我输入为10
你在引用的时候L->data[i+1]=L->data[i];这条语句中,i的值是表长度,因为刚才我们假设输入10
那么,L->data[i];将引用L->data[10];其实L->data[10];里的数据你并没有赋值,你只是对下标为
L->data[0]到[9]做了赋值.所以在引用时它是一个随机的数.
这样一来,当你输入插入位置是11的时候(也就是表尾),将发生错误的值.
还有一个问题是flag变量在这个函数中起什么作用.
Status inslist(seqlist *L,int n)
{
int m=0,i=0,flag=1;
if(n>L->length+1||n<1)
return ERROR;
printf("input want inverst the number:\n");
scanf("%d",&m);
for(i=L->length;i>=n;--i)
L->data[i+1]=L->data[i];
flag=0;
L->data[n]=m;
++L->length;
printf("the new seqlist is :\n");
for(m=0;m<L->length;m++)
printf("%d ",L->data[m]);
return OK;
}
我来回复