4-20 这是一次失败的小项目 (单链表应用--通讯录)

  昨天和今天一直在磕这个小项目,由于近来学习了单链表的相关知识,所以想趁周末做一个通讯录的小项目,主要功能就是增,删,插入。

  但是意外重重 在做这个小项目的过程中有几点深入的体会:

  1. 应该深入学习一下软件工程,了解软件是如何设计的,因为在写完功能之后再写主界面时,感觉十分混乱。没有办法画一个清晰的逻辑框图,也可能是原来的项目都是有人设计好,第一次自己去设计,要多加练习;
  2. 深入学习一下c语言标准库,从而对系统定义的函数有更好的操作性;

先上一下这个失败的代码吧

  1. 1 #include<stdio.h>
    2 #include<stdlib.h>
    3 typedef struct NODE
    4 {
    5 int num;
    6 char *name;
    7 int idnum;
    8 char *prof;
    9 char *tel;
    10 struct NODE *next;
    11 }Node;
    12 Node *GetNode(int num,char *name,int idnum,char *prof,char *tel);
    13 void AddNode(Node **ppHead,Node **pEnd,Node *pNode);
    14 void InsertNode(Node **ppHead,Node **ppEnd,Node *pNode,int num);
    15 void DeleteNode(Node **ppHead,Node **ppEnd,int num);
    16
    17 int main()
    18 {
    19 Node *pHead = NULL;
    20 Node *pEnd = NULL;
    21 int ChooseNum;
    22 int num;
    23 int Insertnum;
    24 int Deletenum;
    25 char name[50] = {0};
    26 int idnum;
    27 char prof[50] = {0};
    28 char tel[50] = {0};
    29 int i;
    30 printf("-----------------------------------------------\n");
    31 printf(" \n");
    32 printf(" 通讯录 \n");
    33 printf(" \n");
    34 printf("-----------------------------------------------\n");
    35 while(1)
    36 {
    37 printf("1-----------添加\n");
    38 printf("2-----------插入\n");
    39 printf("3-----------删除\n");
    40 printf("4-----------查看\n");
    41 printf("5-----------退出\n");
    42 printf("请选择: ");
    43 scanf("%d",&ChooseNum);
    44 switch (ChooseNum)
    45 {
    46 case 1:
    47 printf("请输入序号: ");
    48 scanf("%d",&num);
    49 printf("请输入姓名: ");
    50 scanf("%s",&name);
    51 printf("请输入学号: ");
    52 scanf("%d",&idnum);
    53 printf("请输入专业: ");
    54 scanf("%s",&prof);
    55 printf("请输入联系电话: ");
    56 scanf("%s",&tel);
    57 AddNode(&pHead,&pEnd,GetNode(num,name,idnum,prof,tel));
    58 break;
    59 case 2:
    60 printf("请输入插入序号: ");
    61 scanf("%d",&Insertnum);
    62 printf("请输入序号: ");
    63 scanf("%d",&num);
    64 printf("请输入姓名: ");
    65 scanf("%s",name);
    66 printf("请输入学号: ");
    67 scanf("%d",&idnum);
    68 printf("请输入专业: ");
    69 scanf("%s",prof);
    70 printf("请输入联系电话: ");
    71 scanf("%s",tel);
    72 InsertNode(&pHead,&pEnd,GetNode(num,name,idnum,prof,tel),Insertnum);
    73 break;
    74 case 3:
    75 printf("请输入删除序号: ");
    76 scanf("%d",&Deletenum);
    77 DeleteNode(&pHead,&pEnd,Deletenum);
    78 case 4:
    79 printf("\n\n\n\n");
    80 printf("序号 姓名 学号 专业 联系方式\n");
    81 while(pHead!=NULL)
    82 {
    83 printf("%-12d%-12s%-12d%-12s%-12s\n",pHead->num,pHead->name,pHead->idnum,pHead->prof,pHead->tel);
    84 pHead = pHead->next;
    85 }
    86 printf("\n\n\n\n");
    87 break;
    88 case 5:
    89 printf("欢迎再次使用 谢谢!\n");
    90 break;
    91 default:
    92 printf("输入错误!!!\n");
    93 break;
    94 }
    95 if(ChooseNum == 5)
    96 break;
    97 //while(i==50)
    98 //{
    99 // name[i] = 0;
    100 // prof[i] = 0;
    101 // tel[i] = 0;
    102 //}
    103 printf("------------------------------------------------\n");
    104 }
    105
    106
    107
    108 return 0;
    109 }
    110 Node *GetNode(int num,char *name,int idnum,char *prof,char *tel)
    111 {
    112 Node *pTemp = (Node *)malloc(sizeof(Node));
    113 pTemp->num = num;
    114 pTemp->name = name;
    115 pTemp->idnum = idnum;
    116 pTemp->prof = prof;
    117 pTemp->tel = tel;
    118 pTemp->next = NULL;
    119
    120 return pTemp;
    121 }
    122 void AddNode(Node **ppHead,Node **ppEnd,Node *pNode)
    123 {
    124 if(*ppHead == NULL)
    125 {
    126 *ppHead = pNode;
    127 *ppEnd = pNode;
    128 }
    129 else
    130 {
    131 (*ppEnd)->next = pNode;
    132 *ppEnd = pNode;
    133 }
    134 }
    135 void InsertNode(Node **ppHead,Node **ppEnd,Node *pNode,int num)
    136 {
    137 Node *pMark = *ppHead;
    138 if((*ppHead)->num = num)
    139 {
    140 pNode->next = *ppHead;
    141 *ppHead = pNode;
    142 return ;
    143 }
    144 while((pMark->next)!=NULL)
    145 {
    146 if(pMark->next->num = num)
    147 {
    148 pNode->next = pMark->next;
    149 pMark->next = pNode;
    150 return;
    151 }
    152 }
    153 (*ppEnd)->next = pNode;
    154 *ppEnd = pNode;
    155 return ;
    156
    157 }
    158 void DeleteNode(Node **ppHead,Node **ppEnd,int num)
    159 {
    160 Node *pMark = *ppHead;
    161 Node *pDelete = NULL;
    162 if((*ppHead)->num == num)
    163 {
    164 pDelete = *ppHead;
    165 *ppHead = (*ppHead)->next;
    166 free(pDelete);
    167 pDelete = NULL;
    168 }
    169 while(pMark->next != NULL)
    170 {
    171 if(pMark->next->num == num)
    172 {
    173 pDelete = pMark->next;
    174 pMark->next = pDelete->next;
    175 free(pDelete);
    176 pDelete =NULL;
    177 return ;
    178 }
    179 if(pMark->next = (*ppEnd))
    180 {
    181 pDelete = (*ppEnd);
    182 *ppEnd = pMark;
    183 (*ppEnd)->next = NULL;
    184 free(pDelete);
    185 pDelete = NULL;
    186 return;
    187 }
    188 pMark = pMark->next;
    189 }
    190 }

  纠结很长时间的地方集中于,字符串输入这一方面:

  1. 第一次考虑在主函数中存储字符串应用 字符数组 的方式,但结果是打印这个通讯录时,后面一个结点所有的字符串会把前面所有的字符串覆盖掉,在分析之后发现,从scanf()输入到字符数组里,再传入到GetNode()这其中的步骤都可正常运行,但是当第二次甚至更多次添加节点的时候 在GetNode()的函数中  结构体内字符串型指针都会指向 main函数里的数组首元素地址,就导致我在更新字符数组后,之前结点内的字符串也会跟着改变。体现出来就是之前结点内字符串会被最后一个结点内字符串所覆盖;
  2. 第二次考虑设置一个char *的指针,我本以为scanf()内输入字符串为输入字符串的地址,但实际却不是这样,编译器提示输入位置冲突(具体原因我再进一步研究,因为假设是按字符输入的话,我把字符输入进一个空间内,也没什么毛病呀)
  3. 第三次考虑给char *指针 在堆区开一个空间,结果是编译器在输出的时候报错,下断点调试的时候发现,字符串根本没有存进指针内。
  4. 第四次考虑利用getchar()单个存入我开在堆区的空间里,后来由于getchar()是用来显示我存在缓冲区内的函数,在输入字符串前,还有其他数字和\n出现,就会导致这个程序会提前结束,代码如下:

    1 char *name = (char *)malloc(5);
    2 char *pMark = name;
    3 char c;
    4 while((c = getchar()) != ‘\n‘)
    5 {
    6       *pMark = c;
    7       pMark++;
    8 }

  这个项目还得继续研究,重点集中于 如何存储字符串,除了用字符数组的方式,和scanf()的作用原理,正好买了《c标准库》这本书 能研究一下

2019-04-21 19:16:35 编程小菜鸟反思,大佬勿喷,谢谢!!!

原文地址:https://www.cnblogs.com/xgmzhna/p/10746338.html

时间: 2024-08-02 02:56:49

4-20 这是一次失败的小项目 (单链表应用--通讯录)的相关文章

6-1 单链表逆转(20 分)

6-1 单链表逆转(20 分) 本题要求实现一个函数,将给定的单链表逆转. 函数接口定义: List Reverse( List L ); 其中List结构定义如下: typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */ L是给定单链表,函数Rever

习题11-8 单链表结点删除 (20分)

习题11-8 单链表结点删除 (20分) 本题要求实现两个函数,分别将读入的数据存储为单链表.将链表中所有存储了某给定值的结点删除.链表结点定义如下: struct ListNode { int data; ListNode *next; }; 函数接口定义: struct ListNode *readlist(); struct ListNode *deletem( struct ListNode *L, int m ); 函数readlist从标准输入读入一系列正整数,按照读入顺序建立单链表

6-1 单链表逆转 (20分)

题目链接:6-1 单链表逆转 (20分) 方式一:递归逆置单链表 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 #include <string.h> 5 #include <ctype.h> 6 7 #define maxn 5000 8 #define newline printf("\n") 9 10 11 typedef int Ele

oracle ebs 12.20 安装成功其过程失败日记及总结(1)

由于公司业务须要,须要安装oracle ebs进行 form 开发,所以就開始了痛苦oracle ebs安装之过程.刚開始是在vm中win2003 server 中安装ebs,,不知是我自已的水平太差还是运气太差,依照网络中安装ebs,安装通过了检測是,但在安装的过程中出现了各种莫名的错误,而在网络中相关解决错误的方法非常少,并且由于这个换了win2008,win2003英文版还是出现各种错误,即使偶尔一次成功了,但还是存在各样问题,总之,ebs将我搞疯了.好吧,正话開始,最后无奈之下,决定在v

oracle ebs 12.20 成功安装其过程失败日记及总结(1)

因为公司业务需要,需要安装oracle ebs进行 form 开发,所以就开始了痛苦oracle ebs安装之过程.刚开始是在vm中win2003 server 中安装ebs,,不知是我自已的水平太差还是运气太差,按照网络中安装ebs,安装通过了检测是,但在安装的过程中出现了各种莫名的错误,而在网络中相关解决错误的方法很少,而且因为这个换了win2008,win2003英文版还是出现各种错误,即使偶尔一次成功了,但还是存在各样问题,总之,ebs将我搞疯了.好吧,正话开始,最后无奈之下,决定在vm

我经历过的失败产品和项目(六):体验很差的视频会议系统

背景 这个产品从07开始做,到13年基本停止开发,持续了6年时间.当时上这个,主要是我们公司的媒体服务器专注视频,而视频的应用,但是也就视频会议的应用比较广泛. 所以在07年的时候,招了几个兄弟,开始基于媒体服务器,开发会议服务器 描述 公司那几年,在视频会议上面投入的精力是最多的,每年至少有20人的投入,主要分为4个小组:硬件平台组.媒体服务器组.应用服务器组.测试组,整个产品由研发主管领导.主要里程碑点: 08年落下第一单,河南网通,小几百万的单子 09年完成中移动研究院的测试: 10年尝试

我经历过的失败产品和项目(二):一款无疾而终的棋牌类游戏

背景 这个项目大概是在04年启动的,05年结束.是面向江浙地区的在线棋牌游戏平台,投资方是一个浙江的土豪(投的钱也不多). 研一的时候,机房老师找到我们导师,需要几个学生加入到他们的团队,打打下手.所以我们导师的几个学生开始加入他们的团队开始开发.我是在04年10月份加入的. 描述 所有成员都是兼职,核心成员是3个,一个是学校机房老师.一个是某大型软件外包公司的项目经理.还有一个是某软件公司的高级工程师.其中资金是机房老师拉来的,平时的管理和项目推动都以他为主. 我进入之后,研发团队最多的时候有

我经历过的失败产品和项目(四):没有落单的多媒体彩铃媒体服务器

背景 2009年国家发布3G牌照,一时间运营商纷纷上线视频业务.对于我们这个专业做视频硬件服务器的公司来说,正好赶上了大环境,也是纷纷开始开发各类的视频业务,多媒体彩铃是其中一款. 我们公司07年成立,之前一直处于开发硬件的媒体服务器阶段,该服务器只是提供基础的音视频处理能力,其在功耗.性能和体积上面,再国内外都处于领先. 但我们在具体的业务层面从来没有接触过,2009年底的时候正好有家国内比较大的运营商业务提供商找到我们,他们已有的彩铃产品需要添加视频业务,升级成多媒体彩铃.底层的媒体处理这块

我经历过的失败产品和项目(七):定位模糊的面向移动互联网的视频通话应用

背景 2011年下半年的时候,随着移动互联网的普及,移动端的应用越来越多,移动互联网模式初现,强烈的冲击着我们这家做通信公司.作为专业做视频的公司,公司老板决定在移动互联网上面试下水,对于产品只说了这么一句话:大家看下tango,用户只需要在我们的APP上输入手机号,收到短信,就能注册,登录就能免费用我们的视频通话功能,我们先做着,等用户量起来了,我们再做其他想法. 就这样,我们启动了这个项目. 描述 由于我之前刚刚兼任了移动终端组的负责人(从媒体服务器负责人兼任移动终端组负责人,跨度是很大的)