1
#include
<
stdio.h
>
2
3 struct llist
4 {
5 int num;
6 char name[ 10 ];=>改成:string name;
7 struct llist * next;
8 } ;
9 typedef struct llist node;
10 typedef node * llink;
11
12
13 /**/ /* 链表的创建 */
14 llink createllist()
15 {
16 llink head;
17 llink ptr,ptr1;
18 int i;
19
20 head = (llink)malloc( sizeof (node)); // 分配第一个节点 =>head=new node
21 if ( ! head)
22 return NULL;
23 printf( " 请输入六项邮寄数据:\n " );
24 printf( " 请输入编号 ==> " );
25 scanf( " %d " , & head -> num);=> cin>>head->num;
26 printf( " 请输入编号(%d)的姓名 ==> " ,head -> num);
27 scanf( " %s " ,head -> name);=>改成:cin.sync();string lname; cin>>lname;head->name=lname;
28 head -> next = NULL;
29 ptr = head;
30 for (i = 1 ;i < 6 ; i ++ )
31 {
32 ptr1 = (llink)malloc( sizeof (node));=>ptr1 =new node ;
33 if ( ! ptr1)
34 return NULL;
35 printf( " 请输入编号 ==> " );
36 scanf( " %d " , & ptr1 -> num);=>cin>>ptr1->num;
37 printf( " 请输入编号(%d)的姓名 ==> " ,ptr1 -> num);
38 scanf( " %s " ,ptr1 -> name);=> cin.sync();string lname; getline(cin,lname);head->name=lname;
39 ptr1 -> next = NULL;
40 ptr -> next = ptr1;
41 ptr = ptr -> next;
42 }
43 return head;
44 }
45
46 /**/ /* 链表的节点遍历 */
47 llink findnode(llink head, int num)
48 {
49 llink ptr;
50
51 ptr = head;
52 while (ptr != NULL)
53 {
54 if (ptr -> num == num)
55 return ptr;
56 ptr = ptr -> next;
57 }
58 return ptr;
59 }
60
61
62 void main()
63 {
64 llink head;
65 llink ptr;
66 int num;
67
68 head = createllist();
69 if ( ! head)
70 {
71 printf( " 内存分配失败!\n " );
72 exit( 1 );
73 }
74 while ( 1 )
75 {
76 printf( " 请输入要寻找的邮寄编号 ==> " );
77 scanf( " %d " , & num);
78 if (num != 0 )
79 {
80 ptr = findnode(head,num);
81 if ( ! ptr)
82 printf( " 没有找到\n " );
83 else
84 printf( " 姓名:%s\n " ,ptr -> name);
85 }
86 else
87 exit( 1 );
88 }
89 }
2
3 struct llist
4 {
5 int num;
6 char name[ 10 ];=>改成:string name;
7 struct llist * next;
8 } ;
9 typedef struct llist node;
10 typedef node * llink;
11
12
13 /**/ /* 链表的创建 */
14 llink createllist()
15 {
16 llink head;
17 llink ptr,ptr1;
18 int i;
19
20 head = (llink)malloc( sizeof (node)); // 分配第一个节点 =>head=new node
21 if ( ! head)
22 return NULL;
23 printf( " 请输入六项邮寄数据:\n " );
24 printf( " 请输入编号 ==> " );
25 scanf( " %d " , & head -> num);=> cin>>head->num;
26 printf( " 请输入编号(%d)的姓名 ==> " ,head -> num);
27 scanf( " %s " ,head -> name);=>改成:cin.sync();string lname; cin>>lname;head->name=lname;
28 head -> next = NULL;
29 ptr = head;
30 for (i = 1 ;i < 6 ; i ++ )
31 {
32 ptr1 = (llink)malloc( sizeof (node));=>ptr1 =new node ;
33 if ( ! ptr1)
34 return NULL;
35 printf( " 请输入编号 ==> " );
36 scanf( " %d " , & ptr1 -> num);=>cin>>ptr1->num;
37 printf( " 请输入编号(%d)的姓名 ==> " ,ptr1 -> num);
38 scanf( " %s " ,ptr1 -> name);=> cin.sync();string lname; getline(cin,lname);head->name=lname;
39 ptr1 -> next = NULL;
40 ptr -> next = ptr1;
41 ptr = ptr -> next;
42 }
43 return head;
44 }
45
46 /**/ /* 链表的节点遍历 */
47 llink findnode(llink head, int num)
48 {
49 llink ptr;
50
51 ptr = head;
52 while (ptr != NULL)
53 {
54 if (ptr -> num == num)
55 return ptr;
56 ptr = ptr -> next;
57 }
58 return ptr;
59 }
60
61
62 void main()
63 {
64 llink head;
65 llink ptr;
66 int num;
67
68 head = createllist();
69 if ( ! head)
70 {
71 printf( " 内存分配失败!\n " );
72 exit( 1 );
73 }
74 while ( 1 )
75 {
76 printf( " 请输入要寻找的邮寄编号 ==> " );
77 scanf( " %d " , & num);
78 if (num != 0 )
79 {
80 ptr = findnode(head,num);
81 if ( ! ptr)
82 printf( " 没有找到\n " );
83 else
84 printf( " 姓名:%s\n " ,ptr -> name);
85 }
86 else
87 exit( 1 );
88 }
89 }
我们将代码做相应红色的改动。将结构体的name的类型改成string。我们必须注意到以下几点:
1.
我们用cin输入num之后,我们又用cin输入lname(cin>>lname或者getline(cin,lname))。在这之前我们需要调用cin.sync()(清空缓存区)或者fflush(stdin)(清空缓存区)或者getchar()(读取一个字符),因为上一次输入num之后还有一个回车字符留在stdin流中,影响lname的读取,lname会直接被读取为回车。
2.
第20行以及32行,如果结构体name的类型是string,而我们分配内存的方式是malloc的话程序回报错。没有初始 化,name的内存地址有问题,没法用head->name=lname来给其赋值。这时我们应该使用new。两者之间的不同:
- malloc和free是C语言的标准库函数,而new和delete是C++的运算符。他们都是用于申请动态内存和释放内存
- 对于非内部数据类型 的对象而言,用maloc和free无法满足动态对象的要求。对象在创建的同时要求自动执行构造函数,消亡时自动执行析够函数。由于两者是库函数不是运算符,不再编译器控制范围内,没法把执行构造和析构函数的任务给malloc和free。
- 运算符new能完成动态内存分配和初始化 的工作。delete能完成清理和释放内存的工作。
- malloc和free仍然保存的原因:C++程序经常调用C程序,C程序只能使用这两个函数来管理动态内存。
- 两者之间的其他不同:new不需要头文件,malloc需要头文件库函数支持。new建立的是一个对象 ,而malloc分配的是一个内存。正因为new建立的是一个对象,所以才会调用对象里面的构造函数来进行初始化。malloc仅仅只能分配内存,free仅仅回收内存。
3.
exit():参数为零时表示正常退出,参数非零时表示非正常退出。
4.
在c++中不能用加法操作符将两个字符串字面值相加
,语法错误。
5.
getch()和getchar()的区别:前者当你敲击某个键的时候就立即返回了,正常情况下读取的是你敲击的符号。后者可接受多个字符,直到回车才返回,但是第一个字符作为函数的返回值。使用功能之一:scanf()函数在输入时以回车作为结束的标志。但是并没有接受这个回车键,getchar()则用来接收这个回车键。如果缺省,将会影响下面的scanf()语句。因为如果不是用getchar()接收则下面的scanf()将首先接收到这个回车符号,将会导致一些列错误。当然我们也可以使用getch()来实现这个目的。
发表评论
-
set容器的反向迭代器
2013-05-02 16:56 3743#include <iostream> #in ... -
对于CRITICAL_SECTION用法的介绍和理解[转]
2013-04-08 11:50 2181很多人对CRITICAL_SECTION ... -
二维数组知识
2012-09-15 17:20 816二维数组和指针⑴ 用 ... -
Realloc的使用
2012-08-14 11:04 829realloc 用过很多次了。 ... -
extern C的由来
2012-08-09 10:14 695时常在cpp的代码之中看到这样的代码: #ifdef ... -
C++类对象的创建过程
2012-07-26 16:02 939分配空间(Allocation) ... -
静态数据成员和静态成员函数
2012-07-26 15:04 3110静态类成员包括静态数据成员和静态函数成员两部分。 与 ... -
复制构造函数(拷贝构造函数)以及深浅拷贝
2012-07-25 22:39 1429对于普通对象而言复制是很简单的,一般是将变量或者常量赋值给某 ... -
cin、cin.get、cin.getline()、getline()、gets()的用法【转】
2012-07-24 20:05 831学C++的时候,这几个输入函数弄的有点迷糊;这里做个小结,为了 ... -
堆、栈解疑
2012-07-12 21:53 585一、预备知识—程序的内存分配 一个由C/C++编译的程序 ... -
指针和内存分配的深度理解
2012-07-12 18:57 1031一 :关于指针和堆的内存分配 先来介绍一下指针: 指针一种 ... -
数组指针和指针数组
2012-07-12 18:56 1187先看一下基本的形式,我们从这里起步! ----------- ... -
const指针和指向const的指针
2012-07-12 10:30 2120指向const对象的指针 ... -
typedef的学习
2012-07-11 15:03 739typedef,顾名思义,为“类型定义”,可以解释为:将一种数 ... -
函数指针和指针函数
2012-07-11 11:21 594【函数指针】 ... -
Define学习
2012-07-11 10:12 1073宏替换是C/C++系列语言的技术特色,C/C++语言提 ... -
sizeof 深研
2012-07-11 09:39 6671、什么是sizeof 首先看一下sizeof ... -
内存对齐问题
2012-07-10 22:35 10971.内存数据对齐的原因: 无论如何,为了提高程序的性 ... -
指针深究
2012-07-09 21:55 594在说指向指针的指针之前,不得不说指向变量的指针。先看如下示例: ... -
C语言文件使用方式详解
2012-07-04 10:23 768文件的打开(fopen函数) f ...
相关推荐
侯捷——STL和泛型编程笔记1-4讲
新版Android开发教程&笔记--基础入门一 新版Android开发教程&笔记--基础入门二 新版Android开发教程&笔记三--环境搭建与解析 新版Android开发教程&笔记四--Dalvik ADB 新版Android开发教程+笔记五--模拟器、应用1、2...
【Python学习笔记--皮大庆.pdf.zip】是一个针对初学者的Python编程教程,源自英文书籍《How to think like a computer scientist》。这本书以易懂的方式介绍了Python语言的基础知识,旨在帮助没有编程背景的人快速...
《2D游戏编程笔记——DirectX库的使用》是一篇深入浅出地讲解DirectX库在2D游戏编程中应用的教程。作者蒋志强以轻松的写作风格,详细介绍了DirectX库,尤其是DirectDraw组件的使用。这篇文章适合已经有一定C++编程...
QT高级编程视频教程是针对那些想要...同时,提供的"QT高级编程视频教程-最强初级到高级编程开发丁林松--QT高级编程视频教程-最强初级到高级编程开发.txt"文本文件,很可能是课程大纲或者笔记,可以作为辅助学习的资料。
S7-200 Smart入门笔记1-8 程序合集 S7-200 Smart入门笔记1——流水灯 按钮 S7-200 Smart入门笔记1——流水灯 定时器 S7-200 Smart入门笔记2——读时钟 S7-200 Smart入门笔记3——呼吸灯 S7-200 Smart入门笔记4——...
倍福BECKHOFF PLC:自动化编程笔记(一)对应的程序实例,实现流程顺序控制 - 流水灯。借助CASE OF语法(类似与C语言的 switch case) + 信号上升沿功能块。
新版Android开发教程&笔记--基础入门一.pdf 新版Android开发教程&笔记--基础入门二.pdf 新版Android开发教程&笔记三--环境搭建与解析.pdf 新版Android开发教程&笔记四--Dalvik ADB.pdf 新版Android开发教程+笔记五--...
《WebGL编程指南》学习笔记webgl-study-notes
读书笔记----ARM汇编_编程.zip
《游戏编程笔记-起步3-贪吃蛇游戏源代码》 贪吃蛇是一款经典的游戏,它的设计简单却富有挑战性,深受玩家喜爱。本篇笔记将深入探讨如何使用C++和Visual Studio 2008(以下简称VS2008)来实现一个简易的贪吃蛇游戏。...
Python核心编程笔记-.pdf
单片机听课笔记 1-8 课是金沙滩工作室 2014 年更新的单片机学习笔记,涵盖了单片机的基础知识、KEIL 软件安装、单片机编程、硬件基础学习等方面的内容。 Lesson 1 讲解了 KEIL 软件的安装和基本配置,包括安装 ...
尚硅谷康师傅java学习笔记。 、2020-4-5 java学习笔记 2020-4-6 java笔记 ---内部类 2020-4-6 java笔记 ---异常 ...2020-4-19 java 网络编程 2020-4-21 java反射 2020-4-22 java8 新特性 2020-4-27 单元测试
新版Android开发教程&笔记--基础入门一 新版Android开发教程&笔记--基础入门二 新版Android开发教程&笔记三--环境搭建与解析 新版Android开发教程&笔记四--Dalvik ADB 新版Android开发教程+笔记五--模拟器、应用1、2...
python1903笔记 02-网络编程.zip
新版Android开发教程&笔记--基础入门一.pdf 新版Android开发教程&笔记--基础入门二.pdf 新版Android开发教程&笔记三--环境搭建与解析.p 新版Android开发教程&笔记四--Dalvik ADB.pdf 新版Android开发教程+笔记...
新版Android开发教程+笔记07--基础UI编程1 新版Android开发教程+笔记08--基础UI编程2 新版Android开发教程+笔记09--基础UI编程3 新版Android开发教程+笔记10--基础UI编程4 新版Android开发教程+笔记11--可视化UI设计...
Android开发教程+笔记十-基础UI编程4.pdf
标题中的“读书笔记软件 编程笔记 学习笔记”暗示了这个软件是专为记录、整理和检索读书、编程及各类学习过程中的知识而设计的。它可能包含以下核心功能: 1. **多类型笔记**:软件允许用户创建不同类型的笔记,...