回 帖 发 新 帖 刷新版面

主题:关于线性表顺序的现实?

如果我定义了以下的数据类型,
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个回复)

沙发

下面是源程序,写了一部分,写不下去了,不知道怎么写,请赐教.
自己顶一下.

#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(){
    ;
}
*/

板凳

#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 楼

非常感谢你的源程序.在这个程序中发现了一些小问题,希望你改一下吧.

当执行到这个函数时,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;   
    }

我来回复

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