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 3673#include <iostream> #in ... -
对于CRITICAL_SECTION用法的介绍和理解[转]
2013-04-08 11:50 2088很多人对CRITICAL_SECTION ... -
二维数组知识
2012-09-15 17:20 767二维数组和指针⑴ 用 ... -
Realloc的使用
2012-08-14 11:04 780realloc 用过很多次了。 ... -
extern C的由来
2012-08-09 10:14 662时常在cpp的代码之中看到这样的代码: #ifdef ... -
C++类对象的创建过程
2012-07-26 16:02 890分配空间(Allocation) ... -
静态数据成员和静态成员函数
2012-07-26 15:04 3050静态类成员包括静态数据成员和静态函数成员两部分。 与 ... -
复制构造函数(拷贝构造函数)以及深浅拷贝
2012-07-25 22:39 1385对于普通对象而言复制是很简单的,一般是将变量或者常量赋值给某 ... -
cin、cin.get、cin.getline()、getline()、gets()的用法【转】
2012-07-24 20:05 777学C++的时候,这几个输入函数弄的有点迷糊;这里做个小结,为了 ... -
堆、栈解疑
2012-07-12 21:53 533一、预备知识—程序的内存分配 一个由C/C++编译的程序 ... -
指针和内存分配的深度理解
2012-07-12 18:57 979一 :关于指针和堆的内存分配 先来介绍一下指针: 指针一种 ... -
数组指针和指针数组
2012-07-12 18:56 1130先看一下基本的形式,我们从这里起步! ----------- ... -
const指针和指向const的指针
2012-07-12 10:30 2068指向const对象的指针 ... -
typedef的学习
2012-07-11 15:03 664typedef,顾名思义,为“类型定义”,可以解释为:将一种数 ... -
函数指针和指针函数
2012-07-11 11:21 531【函数指针】 ... -
Define学习
2012-07-11 10:12 1004宏替换是C/C++系列语言的技术特色,C/C++语言提 ... -
sizeof 深研
2012-07-11 09:39 6331、什么是sizeof 首先看一下sizeof ... -
内存对齐问题
2012-07-10 22:35 10411.内存数据对齐的原因: 无论如何,为了提高程序的性 ... -
指针深究
2012-07-09 21:55 538在说指向指针的指针之前,不得不说指向变量的指针。先看如下示例: ... -
C语言文件使用方式详解
2012-07-04 10:23 708文件的打开(fopen函数) f ...
相关推荐
侯捷——STL和泛型编程笔记1-4讲
oracle笔记二--plsql 编程oracle笔记二--plsql 编程oracle笔记二--plsql 编程oracle笔记二--plsql 编程oracle笔记二--plsql 编程oracle笔记二--plsql 编程
新版Android开发教程&笔记--基础入门一 新版Android开发教程&笔记--基础入门二 新版Android开发教程&笔记三--环境搭建与解析 新版Android开发教程&笔记四--Dalvik ADB 新版Android开发教程+笔记五--模拟器、应用1、2...
Socket网络编程学习笔记之---使用线程池提高性能
非常详细的介绍了游戏编程中会用到的DirectX库的调用细节。作者语言风趣幽默,内容翔实细致。是一本不可多得的好资料。
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——...
Android开发教程 笔记--基础UI编程
倍福BECKHOFF PLC:自动化编程笔记(一)对应的程序实例,实现流程顺序控制 - 流水灯。借助CASE OF语法(类似与C语言的 switch case) + 信号上升沿功能块。
《WebGL编程指南》学习笔记webgl-study-notes
新版Android开发教程&笔记--基础入门一.pdf 新版Android开发教程&笔记--基础入门二.pdf 新版Android开发教程&笔记三--环境搭建与解析.pdf 新版Android开发教程&笔记四--Dalvik ADB.pdf 新版Android开发教程+笔记五--...
读书笔记-Java并发编程实战-基础篇
新版Android开发教程+笔记12--文件存取、数据库编程 新版Android开发教程+笔记12--文件存取、数据库编程
DIRECTX.9.0.3D游戏开发编程基础笔记-矩阵1
新版Android开发教程 笔记7--基础UI编程1
新版Android开发教程 笔记8--基础UI编程2
新版Android开发教程 笔记10--基础UI编程4