鱼C论坛

 找回密码
 立即注册
查看: 1132|回复: 1

Debug Assertion Failed

[复制链接]
发表于 2021-12-21 19:42:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
main.cpp
  1. #include <sstream>
  2. #include <fstream>
  3. #include <cassert>
  4. #include<iostream>
  5. #include<string.h>
  6. #pragma warning(disable:4996)
  7. using namespace std;
  8. #define MAXWORD 25
  9. #define FILEN 100  //读取文件时一行数据的长度
  10. struct record   
  11. {
  12.     char word[MAXWORD+1];
  13.         int length;
  14. };

  15. struct lnode    //链表结点结构
  16. {
  17.         struct record data;
  18.         struct lnode* next;
  19. };

  20. void InsertList(struct lnode* list, struct lnode* n);
  21. void FileAdd(struct lnode*list,char*filename);
  22. void Add(struct lnode* list[]);
  23. void Search(struct lnode* list[]);
  24. void Delete(struct lnode* list[]);
  25. void Display(struct lnode* list[]);
  26. struct lnode* SearchPrimarykey(struct lnode* list, char* key);
  27. void FreeList(struct lnode* list[]);
  28. void DisplayTableHead();
  29. void DisplayRecord(struct lnode* r);

  30. /* 显示菜单 */
  31. void DisplayMenu()
  32. {
  33.     cout << "*******************************************" << endl;
  34.     cout << "****************欢迎使用字典***************" << endl;
  35.     cout << "*****************0.添加单词****************" << endl;
  36.     cout << "*****************1.搜索单词****************" << endl;
  37.     cout << "*****************2.删除单词****************" << endl;
  38.     cout << "*****************3.显示单词****************" << endl;
  39.     cout << "*****************4.退出系统****************" << endl;
  40.     cout << "*******************************************" << endl;
  41.     cout << endl;
  42. }

  43. /* 将记录按首字母升序插入链表 */
  44. void InsertList(struct lnode* list, struct lnode* n)
  45. {
  46.     struct lnode* p = list;

  47.     while (p->next != NULL && strcmp((p->next->data).word, (n->data).word) < 0)
  48.     {
  49.         p = p->next;
  50.     }
  51.     n->next = p->next;
  52.     p->next = n;
  53. }

  54. //从文件中添加单词
  55. void FileAdd(struct lnode*list,char*filename)
  56. {
  57.     struct record t;
  58.     struct lnode* n, * r;
  59.     FILE* fp=NULL;
  60.     char str[FILEN + 1];
  61.     char word[30];
  62.     int h = 0;
  63.     while (fgets(str, FILEN, fp) != NULL)
  64.     {
  65.         h++;
  66.         int i = 0;
  67.         int j = 0;
  68.         for (i; str[i] != ' '; i++)word[i] = str[i];
  69.         word[i] = '\0';
  70.         strcpy(t.word, word);
  71.     }
  72.     /* 判断记录是否已存在,若存在则显示记录,若不存在则添加记录 */
  73.     if ((r = SearchPrimarykey(list, t.word)) == NULL)
  74.     {
  75.         // 申请lnode空间并初始化
  76.         n = new struct lnode;
  77.         if (n != NULL)
  78.         {
  79.             //* 复制记录
  80.             strcpy_s((n->data).word, str);
  81.             //* 插入链表
  82.             InsertList(list, n);
  83.         }
  84.     }
  85.     fclose(fp);
  86. }

  87. /* 添加 */
  88. void Add(struct lnode* list[])
  89. {
  90.     struct record t;
  91.     struct lnode* n, * r;
  92.     struct lnode* onelist;
  93.     /* 录入记录 */
  94.     cout<<"Please input the word: "<<endl;
  95.     getchar();
  96.     gets_s(t.word);
  97.     onelist = *(list + t.word[0] - 97);//通过单词首字母找到单词所属于的链表, a是97
  98.     fflush(stdin);

  99.     /* 判断记录是否已存在,若存在则显示记录,若不存在则添加记录 */
  100.     if ((r = SearchPrimarykey(onelist, t.word)) == NULL)
  101.     {
  102.         /* 申请lnode空间并初始化 */
  103.         n = new struct lnode;
  104.         if (n != NULL)
  105.         {
  106.             /* 复制记录 */
  107.             strcpy((n->data).word, t.word);
  108.             /* 插入链表 */
  109.             InsertList(onelist, n);
  110.         }
  111.     }
  112.     else
  113.     {
  114.         cout << "Record Existed!" << endl;
  115.         void DisplayTableHead();
  116.         DisplayRecord(r);
  117.     }
  118. }

  119. /* 查找 */
  120. void Search(struct lnode* list[])
  121. {
  122.     char e[MAXWORD];
  123.     struct lnode* r;
  124.     struct lnode* onelist;
  125.     cout << "Please input the word you want to search: " << endl;
  126.     getchar();
  127.     gets_s(e);
  128.     onelist = *(list + (e[0] - 97));
  129.     if ((r = SearchPrimarykey(onelist, e)) != NULL) //SearchPrimarykey 会返回一个p指针或者null   ,返回p 说明查找成功,返回null 说明查找失败,单词不存在
  130.     {
  131.         DisplayTableHead();
  132.         DisplayRecord(r);
  133.     }
  134.     else
  135.     {
  136.         cout << "Cannot find the word." << endl;
  137.     }
  138. }

  139. /* 删除 */
  140. void Delete(struct lnode* list[])
  141. {
  142.     char e[MAXWORD];
  143.     struct lnode* q, * p;
  144.     struct lnode* onelist;

  145.     cout << "Please input the word you want to delete: " << endl;
  146.     getchar();
  147.     gets_s(e);

  148.     onelist = *(list + e[0] - 97);
  149.     q = onelist;
  150.     p = onelist->next;
  151.     while (p != NULL)
  152.     {
  153.         if (strcmp((p->data).word, e) == 0)
  154.         {
  155.             q->next = p->next;
  156.             delete p;    /* 释放空间 */
  157.             return;    /* 函数返回 */
  158.         }
  159.         q = p;
  160.         p = p->next;
  161.     }
  162. }

  163. /* 显示所有记录 */
  164. void Display(struct lnode* list[])
  165. {
  166.     int c = 0;
  167.     struct lnode* p;
  168.     char charr[3];//存放a-z字符

  169.     cout << "\n--------请输入a--z中任意一个字符---------\n" << endl;
  170.     getchar();
  171.     gets_s(charr);
  172.     p = *(list + charr[0] - 97);
  173.     p = p->next;
  174.     cout << "\n--------- ReaderMessage Display ---------\n" << endl;
  175.     void DisplayTableHead();

  176.     while (p != NULL)
  177.     {
  178.         DisplayRecord(p);
  179.         c++;    /* 记录条数 */
  180.         p = p->next;
  181.     }
  182.     cout << "\n--------- Total:  %d  Record(s) ---------\n" << endl;
  183. }

  184. /* 按主键查找 */
  185. struct lnode* SearchPrimarykey(struct lnode* list, char* key)//传进来的list是当前单词首字母那个链表,不是全部的
  186. {
  187.     struct lnode* p = list->next;   //p指向一个节点,通过比较看一下这个节点是不是要查的单词,如果是,把p指向的节点返回。
  188.     while (p != NULL)
  189.     {
  190.         if (strcmp((p->data.word), key) == 0)
  191.         {
  192.             return p;
  193.         }
  194.         p = p->next;
  195.     }
  196.     return NULL;
  197. }

  198. /* 释放整个链表空间 */
  199. void FreeList(struct lnode* list[])
  200. {
  201.     struct lnode* p, * onelist;
  202.     for (int i = 0; i < 26; i++)
  203.     {
  204.         onelist = *(list + i);
  205.         p = onelist;
  206.         while (p->next != NULL)
  207.         {
  208.             p = p->next;
  209.             free(onelist);
  210.             onelist = p;
  211.         }
  212.         delete p;
  213.     }
  214. }

  215. /* 显示表头 */
  216. void DisplayTableHead()
  217. {
  218.     cout << "WORD" << endl;
  219. }

  220. /* 显示一条记录 */
  221. void DisplayRecord(struct lnode* r)
  222. {
  223.     cout << (r->data).word << endl;
  224. }

  225. int main()
  226. {
  227.         struct lnode* dictionary[26];
  228.         struct lnode* p;
  229.         char filename[20];//文件名字(用来读取a.txt    b.txt...里面的单词文件, *.txt  名字是需要改变的)

  230.         /* 头结点 */
  231.         for (int i = 0; i < 26; i++)
  232.         {
  233.                 dictionary[i] = new struct lnode;
  234.                 if (dictionary[i] != NULL)
  235.                 {
  236.                         dictionary[i]->next = NULL; //初始化
  237.                 }
  238.         }

  239.         for (int i = 0; i < 26; i++)
  240.         {
  241.                 char charr[3];
  242.                 charr[0] = (char)(i + 97);
  243.                 charr[1] = ' ';
  244.                 charr[2] = '\0';
  245.                 strcpy_s(filename, "./dir/");
  246.                 strcat_s(filename, charr);
  247.                 strcat_s(filename, ".txt\0");

  248.                 p = *(dictionary + i);
  249.         FileAdd(p,filename);
  250.         }

  251.     int choice;
  252.         while (1)
  253.         {
  254.         DisplayMenu();
  255.         cout << "请输入您的选择:" << endl;
  256.         cin >> choice;

  257.         switch (choice)
  258.         {
  259.         case 0:
  260.             Add(dictionary);
  261.             break;
  262.         case 1:
  263.             Search(dictionary);
  264.             break;
  265.         case 2:
  266.             Delete(dictionary);
  267.             break;
  268.         case 3:
  269.             Display(dictionary);
  270.             break;
  271.         case 4:
  272.             exit(0);
  273.             break;
  274.         default:
  275.             cout << "Input Error! Please input the right word." << endl;
  276.             break;
  277.         }
  278.         }
  279.         FreeList(dictionary);
  280. }
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-22 12:10:40 | 显示全部楼层
本帖最后由 jhq999 于 2021-12-22 12:14 编辑

  1. void FileAdd(struct lnode*list,char*filename)
  2. {
  3.         struct record t;
  4.         struct lnode* n, * r;
  5.         FILE* fp=fopen(filename,"rb");////////
  6.         char str[FILEN + 1];
  7.         char word[30];
  8.         int h = 0;
  9.         if(fp)
  10.         {
  11.                 while (fgets(str, FILEN, fp) != NULL)//fp=NULL,文件都未打开,怎么获得文件里的字符串
  12.                 {
  13.                         h++;
  14.                         int i = 0;
  15.                         int j = 0;
  16.                         for (i; str[i] != ' '; i++)word[i] = str[i];
  17.                         word[i] = '\0';
  18.                         strcpy(t.word, word);
  19.                 }
  20.                 /* 判断记录是否已存在,若存在则显示记录,若不存在则添加记录 */
  21.                 if ((r = SearchPrimarykey(list, t.word)) == NULL)
  22.                 {
  23.                         // 申请lnode空间并初始化
  24.                         n = new struct lnode;
  25.                         if (n != NULL)
  26.                         {
  27.                                 //* 复制记录
  28.                                 strcpy_s((n->data).word, str);
  29.                                 //* 插入链表
  30.                                 InsertList(list, n);
  31.                         }
  32.                 }
  33.                 fclose(fp);
  34.         }
  35. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-21 19:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表