回 帖 发 新 帖 刷新版面

主题:[原创]程序改错//用顺序表练习的一个程序

//[color=800000]这是个非常粗糙的程序,关于背单词.有空帮我改改,小弟先谢咯[em3][/color]
//这个单词本里插入,删除,都是默认在线形表的表尾.然后TravelList时从表尾开始一直访问到表头.
//在这个线形表里与我平常的线形表有一点不同,它的第一个数据项不是ElemType *elem.而是一个结构体struct WordType word.这里存放一个单词的全部信息:单词,翻译,例子.

#include "stdafx.h"
#include "stdio.h"
#include "time.h"
#include "dos.h"
#include "string.h"
#include "malloc.h"
#define NULL 0
#define ERROR -1
#define OK 1
#define LIST_INIT_SIZE    100
#define LISTINCREMENT     10
#define  intpn     10//单词翻译的字符数
#define egn 20//单词例子的字符数
#define ESC 0x001b
typedef char ElemType;
typedef struct {
    ElemType *_word;//单词,唯一性
    ElemType *intp;//单词解释,在一个小单词本里,也可算是唯一性
    ElemType *eg;//单词的例子
}WordType;
typedef  struct  {
   struct WordType *word;
   int         length;
   int        listsize;
}  SqList ;     // 顺序存储的线性表类型



int InitList_Sq  (SqList &L)//初始化线形表
{  FILE *fp;
   fp=fopen("wordnote.dat","wb+");
    L.word=(struct *)malloc(LIST_INIT_SIZE*sizeof(struct Sqlist));
   if (!L.word) return ERROR;
   L.length=0;
   L.listsize=LIST_INIT_SIZE;
   fclose(fp);
   return OK;
}
int DelList_Sq  (SqList &L,ElemType *word_cur)//删除单词word_cur
{  FILE *fp;
   fp=fopen("wordnote.dat","wb+");
   if(fp==NULL) 
   {printf("文件打开失败,任意键继续:(\n");
     return 0;
   }
   else
   {
    struct WordType *word_temp;
    int i,j=0,k;
    for(i=0;i<strlen(word_cur);i++)word_temp._word[i]=word_cur[i];
    while(strcmp(word_temp._word,L.word[i]._word))j++;
    if(j>=strlen(L.length))return ERROR;
    else{
        for(k=j;k<L.length;k++)L.word[k]=L.word[k+1];
        L.length--;
    }
    fclose(fp);
    return OK;
}
int InsertList_Sq   (SqList &L,ElemType *word_cur)//插入单词word_cur
{   int j,k,a,b;
    char intp_cur,eg_cur;
    struct WordType word_temp;
    FILE *fp;
   fp=fopen("wordnote.dat","wb+");
   if(fp==NULL) 
   {printf("文件打开失败,任意键继续:(\n");
     return 0;
   }
   else{
      //循环体的语句完成数据元素后移一个单元格功能
     //k的初值为最后一个数据元素的下标 终值为原线性表的第i数据元素下标
     for(j=0;j<strlen(word_cur);j++)
     {while(word_cur[j]!='\n')word_temp._word[j]=word_cur[j];}
     L.word[i-1]=word_temp._word;
     printf("输入单词的翻译\n");
     scanf("%intpn*c",&intp_cur);
     for(a=0;a<10;a++){L.word[L.length].intp[a]=intp_cur;}
     printf("输入单词的例子\n");
     scanf("%egn*c",%eg_cur);
     for(b=0;b<20;b++){L.word[L.length]._word[b]=eg_cur;}
     L.length++;}
   fclose(fp);
   return OK;
}
void ResetList_Sq   (SqList &L,ElemType *word_cur)//修改已经存在单词本里的单词
{int i=0,a,b;
char intp_cur,eg_cur;
struct WordType word_temp;
FILE *fp;
fp=fopen("wordnote.dat","wb+");
   if(fp==NULL) 
   {printf("文件打开失败,任意键继续:(\n");
     return 0;
   }
   else
   {while(strcmp(word_temp._word,L.word[i]._word)!=0)i++;
   if(i>=L.length)printf("这个单词不存在,重新输入:)\n");
   else{printf("请修改这个单词的解释:\n");
        scanf("%intpn*c",&intp_cur);
        for(a=0;a<strlen(intp_cur);a++)L.word[i].intp[a]=intp_cur[a];
        printf("\n请修改这个单词的例子:\n");
        scanf("%egn*c",&eg_cur);
        for(b=0;b<strlen(eg_cur);b++)L.word[i].eg[b]=eg_cur[b];
   }
   }
   fclose(fp);
}



void TravelList_Sq  (SqList L,int li)//采用递归算法,最开始背诵最后一个单词,依次望前背诵.
{   int i,j=0,a;
    li=L.length-1;
    ElemType *word_cur;
    struct WordType word_temp;
    printf("单词解释:\n");
    for(a=0;a<strlen(L.word[li].intp);a++)printf("%c",L.word[li].intp[a]);
    printf("请输入单词:\n");
    scanf("%*c",&*word_cur);
    for(i=0;i<strlen(word_cur);i++)
    {word_temp._word[i]=word_cur[i];}
    if(strcmp(L.word[li]._word,word_cur))
    {
        printf("单词错误:(请想想\n");//和单词比较
        TravelList_Sq(L,li);
    }
    else
    {printf("单词正确:)\n");
     TravelList_Sq(L,li-1);
    }
    //for (i=0;i<=L.length-1;i++)  
        //visit(L.elem[i]) ;
  }

void main()
{
char key;
struct tm tm;
_getsystime(&tm);
printf("\t\t\t\t单词背诵\t\t\t\t时间:%d月%d天%时\n",tm.tm_mon,tm.tm_mday,tm.tm_hour);
printf("\t\t\t\t制作日期:2006年7月");
printf("操作向导:\n数字1:背单词;数字2:插入生单词;数字3:删除已背熟的单词\n");
scanf("%c",&key);
switch((int)key){
 case 0x0031:TravelList_Sq  (SqList L,ElemType *intp_temp);//键盘数字1
 case 0x0032:InsertList_Sq  (SqList &L,ElemType *word_cur);//键盘数字2
 case 0x0033:ResetList_Sq   (SqList &L,ElemType *word_cur);//键盘数字3
 case 0x0034:DelList_Sq     (SqList &L,ElemType *word_cur);//键盘数字4
 case ESC:return 0;
}
main();
}

回复列表 (共5个回复)

沙发

我是一名即将大三的学生,是数据结构初学者,刚建立了一个QQ群:17416147.希望四海的朋友们相互帮助,相互努力提高:)
只希望群里不会出现1个星期里像是没人一样一句话都话发的情况,那群建立就没有意义了:(

板凳

群号应该是------27416147-----------
太粗心了!

3 楼

这里问题主要就是:
1.L.word=(struct WordType *)malloc(LIST_INIT_SIZE*sizeof(struct WordType));//use of undefined type 'WordType'
2.struct WordType *' : unknown size//unable to recover from previous error(s)
3.word_temp=(struct WordType *)malloc(sizeof(struct WordType));//'=' : cannot convert from 'struct WordType *' to 'int'
4.fwrite(L,sizeof(struct WordType),1,fp);//use of undefined type 'WordType'//'fwrite' : cannot convert parameter 1 from 'SqList' to 'const void *'
帮我修改一下,谢谢

4 楼

我把程序改了几天,终于只剩下一个问题:可以运行了,就是文件操作是失败的,把单词进行插入,可是插入失败.帮我看看,谢谢
//----------------------part 1-------------------------
#include "stdafx.h"
#include "stdio.h"
#include "time.h"
#include "dos.h"
#include "string.h"
#include "malloc.h"
#include "conio.h"
#include "stdlib.h"
#define NULL 0
#define ERROR -1
#define OK 1
#define LIST_INIT_SIZE    100
#define LISTINCREMENT     10
typedef char ElemType;
#define word_cur_len_max 100
#define word_len_max 100
#define intp_len_max 100
#define eg_len_max 100
struct WordType{
    ElemType _word[word_len_max];//单词,唯一性
    ElemType intp[intp_len_max];//单词解释,在一个小单词本里,也可算是唯一性
    ElemType eg[eg_len_max];//单词的例子
};
typedef struct{
   struct WordType *word;
   int         length;
   int        listsize;
}SqList;     // 顺序存储的线性表类型



int InitList_Sq  (SqList &L)//初始化线形表
{  
    FILE *fp;
    fp=fopen("wordnote.dat","wb+");
    L.word=(struct WordType *)malloc(LIST_INIT_SIZE*sizeof(struct WordType));
    if (!L.word) return ERROR;
    L.length=0;
    L.listsize=LIST_INIT_SIZE;
    fwrite(&L,sizeof(SqList),1,fp);
    fclose(fp);
    return OK;
}
int DelList_Sq  (SqList &L)//删除单词word_cur
{  
    FILE *fp;
    ElemType word_cur[word_cur_len_max];
    fp=fopen("wordnote.dat","wb+");
    if(fp==NULL) 
    {
        printf("文件打开失败,任意键继续:(\n");
        return 0;
   }
   else
   {
       fread(&L,sizeof(SqList),1,fp);
       printf("请出入要删除的单词\n");
       char w;
       int word_cur_len=0;
       scanf("%c",&w);
       while((w!='\n')&&(word_cur_len<=word_cur_len_max))//scanf("%s%*c\n",&word_cur);
       {
           word_cur[word_cur_len]=w;
           word_cur_len++;
           scanf("%c",&w);
       }
       int i=0;
       while(word_cur!=L.word[i]._word)i++;
       if(i>=L.length)
       {
           printf("这个单词不存在\n");
           return ERROR;
       }
       else
       {
           for(int k=i;k<L.length;k++)L.word[k]=L.word[k+1];
           L.length--;
           printf("单词删除成功\n");
       }
       fwrite(&L,sizeof(SqList),1,fp);
       fclose(fp);
       return OK;
   }
}


int InsertList_Sq   (SqList L)//插入单词word_cur
{
    FILE *fp;
    fp=fopen("wordnote.dat","wb+");
    if(fp==NULL) 
    {
        printf("文件打开失败,任意键继续:(\n");
        return 0;
    }
    else
    {
        fread(&L,sizeof(SqList),1,fp);
        printf("请输入要插入的单词\n");
        L.length++;
        char w;
        int i_word=0;
        scanf("%c",&w);
        while((w!='\n')&&(i_word<=word_len_max))
        {
            L.word[L.length-1]._word[i_word]=w;
            i_word++;
            scanf("%c",&w);
        }
        printf("输入单词的翻译\n");
        int i_intp=0;
        scanf("%c",&w);
        while((w!='\n')&&(i_intp<=intp_len_max))//scanf("%s%*c\n",&L.word[L.length-1].intp);
        {
            L.word[L.length-1].intp[i_intp];
            i_intp++;
            scanf("%c",&w);
        }
        printf("输入单词的例子\n");//scanf("%s%*c\n",&L.word[L.length-1].eg);
        int i_eg=0;
        scanf("%c",&w);
        while((w!='\n')&&(i_eg<=eg_len_max))
        {
            L.word[L.length-1].eg[i_eg];
            i_eg++;
            scanf("%c",&w);
        }
        printf("单词插入成功\n");
    }
    fwrite(&L,sizeof(SqList),1,fp);
    fclose(fp);
    return OK;
}


5 楼

//-----------------------part 2-------------------------------------
int ResetList_Sq   (SqList &L)//修改已经存在单词本里的单词
{
    int i=0;
    ElemType word_cur[word_cur_len_max];
    FILE *fp;
    fp=fopen("wordnote.dat","wb+");
    if(fp==NULL) 
    {
        printf("文件打开失败,任意键继续:(\n");
        return 0;
    }
    else
    {
        fread(&L,sizeof(SqList),1,fp);
        printf("请输入要修改的单词:\n");
        char w;
fr:        scanf("%c",&w);
        int word_cur_len=0;
        while((w!='\n')&&(word_cur_len<=word_cur_len_max))
        {
            word_cur[word_cur_len]=w;
            word_cur_len++;
            scanf("%c",&w);
        }
        while(word_cur!=L.word[i]._word)i++;
        if(i>=L.length+1)
        {
            printf("这个单词不存在,重新输入,或者要插入它吗?\ni:插入,否则按任意键:)\n");
            switch(_getch())
            {
            case 'i':
                {
                    InsertList_Sq(L);break;
                }
            case 0x001b:break;
            default:
                {
                    printf("请重新输入那个单词\n");
                    goto fr;
                }
            }
        }
        else
        {
            printf("请修改这个单词的解释:\n");
            scanf("%s%*c\n",&L.word[i].intp);
            printf("\n请修改这个单词的例子:\n");
            scanf("%s%*c\n",&L.word[i].eg);
       }
    }
    fwrite(&L,sizeof(SqList),1,fp);
    fclose(fp);
    return OK;
}



int TravelList_Sq  (SqList L)//采用递归算法,最开始背诵最后一个单词,依次望前背诵.
{
    FILE *fp;
    fp=fopen("wordnote.dat","wb+");
    if(fp==NULL) 
    {
        printf("文件打开失败,任意键继续:(\n");
        return 0;
    }
    fread(&L,sizeof(SqList),1,fp);
    if(L.length==0)
    {
        printf("单词本为空\n要插入生单词吗?\ty:插入新单词,否则退出\n");
        switch(_getch())
        {
        case 'y':InsertList_Sq(L);break;
        default:exit(-1);
        }
    }
    for(int li=L.length-1;li>=0;li--)
    {
        struct WordType *word_temp;
        word_temp=(struct WordType *)malloc(sizeof(struct WordType));
        printf("单词解释:\n");
        printf("%s\n",L.word[li].intp);
fd:        printf("请输入单词:\n");
        scanf("%s%*c\n",&(*word_temp)._word);
        if(strcmp(L.word[li]._word,(*word_temp)._word))
        {
            printf("单词错误:(请想想\n");//和单词比较
            goto fd;
        }
        else
        {
            printf("单词正确:)\n");
        }
        free(word_temp);
    }
    fwrite(&L,sizeof(SqList),1,fp);
    fclose(fp);
    return OK;
}

void main()
{
    char key;
    struct tm tm;
    _getsystime(&tm);
    SqList L;InitList_Sq(L);
    printf("\t\t\t\t单词背诵\t\t时间:%d月%d天%时\n",tm.tm_mon,tm.tm_mday,tm.tm_hour);
    printf("\t\t\t\t\t\t\t制作日期:2006年7月\n");
ci:    printf("操作向导:\n数字1:背单词\t数字2:插入生单词\t数字3:修改单词\t4:删除已背熟的单词\n");
    while(1)
    {
        key=_getch();
        switch(key){
         case 0x0031:TravelList_Sq  (L);goto ci;//键盘数字1
         case 0x0032:InsertList_Sq  (L);goto ci;//键盘数字2
         case 0x0033:ResetList_Sq   (L);goto ci;//键盘数字3
         case 0x0034:DelList_Sq     (L);goto ci;//键盘数字4
         case 0x001b:exit(-1);
         default:_getch();
        }

    }
    
}

我来回复

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