a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 146|回复: 3

[C语言] 2011年计算机等级考试二级C辅导实例编程(19)

[复制链接]
发表于 2012-7-31 21:48:08 | 显示全部楼层 |阅读模式
用链表实现的简易通讯录  #include ' S& M9 g, D* X
  #include
2 K6 P; ]0 q$ g- ~! E* y  #include 2 \+ E) J" e1 p- c
  #define B_PUT puts("+-----------------------------------------------------------------+"); \
/ b5 p& b  u7 h5 C# V0 h. [  puts("|姓名 地址 联系方式 |")
% a3 j( D/ w/ i# e" b  #define END_PUT puts("+-----------------------------------------------------------------+")" l* {: A7 K# U" g
  #define INPUT_NAME puts("请输入联系人姓名:");\- G2 W- v; @- l( {' A5 K$ v3 U
  setbuf(stdin,(char *)0); \
. G  @8 C- V) Z5 D  scanf("%[^\n]",name)//用与修改,查找,删除时,输入name.由于操作频繁,定义为宏
! h1 J- V, \! B  #define FRESH getchar();\' F* v' i9 r+ {8 c  r" ~
  getchar()//一个接受上次的Enter,另一个等待输入Enter.用于Press Enter to Continue( x5 E& f6 ^# O  [! m8 \! \
  /*存放通讯录信息单链表定义*/
" ^# J" I1 i4 C2 A2 z! b: _: `( h9 t  typedef struct( O) p% t& C* l
  {  a$ T' ?+ ?: B6 T! _5 n$ b! q$ ~/ o" [5 K
  char name[20];, N, z' O6 |0 ~( ~3 [' T6 Q
  char address[30];9 Y! o- [( f4 d1 s9 \
  char tel[20];# n& C0 _! F' o- X0 X6 i' r
  }inf_t;
' D8 a9 L! @9 D% l$ Q  typedef struct node# `% S6 ?1 ?8 z& I0 o
  {9 D5 ~) g) x" b3 i
  inf_t date;
2 q# f" I$ w) k  struct node *next;
$ D. ~7 s$ a6 j  \5 Z& u; D) D7 F  }*link;9 _3 G0 ?& i6 ^- V0 k7 `0 G2 M
  inf_t getInf(void);* F! s5 z6 M: ^- s
  void insert(inf_t inf);
- T. J! Y- o  _4 g: ?9 K  link pop(const char *name,link *pre);
3 O* X9 D. ^1 r4 V' s! L% X  void del(link pre,link cur);
- H4 }) T8 C" I2 d2 }0 A" f* \+ m  void outputOne(link p);
1 L8 X- b; d  |  c3 f5 R  void output(void);9 V" `) r" `- \( p
  void menu(void);
) o  N7 H/ w* q# L  v: s  int save(void);* ?( ]0 v+ b. j4 N: m3 k7 E/ R
  void openfile(void);( z% f7 ~1 Z' S
  link head = NULL;
回复

使用道具 举报

 楼主| 发表于 2012-7-31 21:48:09 | 显示全部楼层

2011年计算机等级考试二级C辅导实例编程(19)

inf_t getInf(void) //获取联系人信息  {0 H$ V, Q$ H( R) t7 u) g
  inf_t t_get;5 ~1 m( Y# i4 ~
  char *pch;* X" s. W; k. o3 P
  printf("\t联系人姓名:");
  P& z/ ~  y3 D$ I+ q: P+ R  setbuf(stdin,(char *)0);
7 ?# @/ Q2 a9 ~  scanf("%[^\n]",t_get.name); //存入除换行以外的所有字符
% m, K# g  P& q1 r2 c7 K* t  printf("\t该联系人地址:");) F: |- q) i# k/ Q- H9 t' ?( v
  setbuf(stdin,(char *)0);
: s; l# R- ?* N7 u8 X' |! w  scanf("%[^\n]",t_get.address);! _+ g0 z' _1 C8 q; K" A
  lableTel:2 A' E9 H% {0 @  d9 T  w
  printf("\t电话或手机号码:");. N  \6 ?: |1 ^5 J
  setbuf(stdin,(char *)0);# U* R1 @4 m, S& g3 O. `
  scanf("%s",t_get.tel);
2 |' O# H4 M& r) B  L4 i  /*处理当号码不为数字的情况*/
  t0 z0 p) @. _, d  h  for(pch = t_get.tel; *pch != '\0'; pch++){1 N- ~6 I) i) f
  if(*pch < '0' || *pch > '9'){0 J1 e& W& s% `( n& X
  puts("该通讯录暂只支持纯数字的电话号码!");
+ E8 _" L& j! x% }7 n' @* H$ O5 u  goto lableTel;
' L- M3 w# y/ @" g  }9 K8 z6 C3 o, p7 m
  }
8 J! `6 Q( i7 X  return t_get;
6 f% W: j! `9 U  }( |5 p6 n9 w- y5 f6 u
  void insert(inf_t inf)//创建一个新结点,数据域存放inf,通过头插法插入单链表* Z( K. R  Z; j  p6 ]0 R3 k
  {; r; \' p+ d& c% d5 d4 j! e3 o& {
  link p = (struct node *)malloc(sizeof *p);
3 ?: L; m2 j- r8 R  p->date = inf;5 a8 J, J3 q% W: _$ r' S2 p
  p->next = head;
' f0 l  O) A+ D2 q& U$ \' H  head = p;5 T+ o3 U" Y5 b: l9 ]9 j: R
  }
7 U: l; c) V  \. t  /*匹配单链表中为姓名项为name的节点 pre为指向该节点前一项的指针的指针 */5 G+ f% g* r( R# U; Z' n  Y
  link pop(const char *name,link *pre){5 v+ k( G, r1 E+ [1 T! f
  link p = head;4 [- ~; A, Z! W! \/ [  c
  while(p != NULL){
! C4 y/ _: |' n2 N. J6 M/ `  if(strcmp(name,p->date.name) == 0){
; r3 E- P+ f/ L  return p;
: a* P6 J1 X  J& |  F  }
0 X0 x4 G, M8 ?4 r  W7 f  *pre = p;
7 V# V8 K7 {- |/ }- ~% ^( H$ C4 Z  p = p->next;+ j$ ]6 e6 D6 n9 a* z# e0 A* ?
  }. u6 n! d2 z" V9 g  V4 p
  return NULL;
- n# h+ }8 r6 A0 D  }
3 W6 w0 p6 ^$ B  d$ P' u  void del(link pre,link cur) //删除cur结点,pre为cur前一个结点
1 g5 i2 @" z8 i; C( t* \/ T  {
3 P0 S6 H) o# u3 c5 M  if(cur == head){
! g  T7 F8 F8 ]) I* g  head = cur->next;
% o: ?6 o! r5 C# ~, {  }
  W( [7 d! M7 G3 d2 |& K  else pre->next = cur->next;9 y! g$ ?- ^. c9 F1 `! e3 u5 m2 l' C. ?
  free(cur);
8 @& l& \( e! w0 G; v  }+ G! R& T/ Z! Y3 m  s
  void outputOne(link p)4 Z; o1 k/ L2 w' p. ?1 G6 H! s6 Z
  {* h* v: M9 Z/ q8 \  p
  printf("|%-20s%-30s%-15s|\n",p->date.name,p->date.address,p->date.tel);8 v$ L& ~8 _. p4 ?
  }
7 Y. n7 k' R' A* |6 N$ v  void output(void)
; r+ i& t: D& E) V  {
. C, A1 `2 }; J% y6 {3 X- f' s7 G( N  link p = head;
9 Z: V& N  c, \1 w8 M% X% M2 U4 W  B_PUT;3 p: t" |* c! e
  while(p != NULL){
5 i- s# {. L1 S$ E1 u) \  outputOne(p);
# g, m, y5 ~; B+ B  p = p->next;, e  W% M. ?  K1 D7 Y" o, Q
  }
; X) [4 ?3 r; I/ v* D  END_PUT;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 21:48:10 | 显示全部楼层

2011年计算机等级考试二级C辅导实例编程(19)

 }  void menu(void)
/ {% ~. [+ n0 r  F! T8 P  {8 c$ @+ B: ?' Q6 [2 q2 M7 l+ y
  puts("*************欢迎使用简易通讯录*************");
0 T0 S0 b' y, {0 e  puts("*\t+-------------------------+ *");
% P% [; ?2 c  H  puts("*\t| 1.添加记录 | *");2 N  R3 w' v" d$ S3 A
  puts("*\t| 2.删除记录 | *");
) K4 V) E" c! |+ D  puts("*\t| 3.查找记录 | *");
/ ?# U& E: R& i9 Z3 A. c+ t  puts("*\t| 4.修改记录 | *");
0 ^$ E6 v4 h& E- R0 g+ {  puts("*\t| 5.显示所有记录 | *");
3 a  q3 z% x9 E  puts("*\t| 0.保存退出 | *");
4 K5 p3 f% A+ G: _  puts("*\t+-------------------------+ *");  ~3 X8 z. x" O/ t6 {" Y+ \
  puts("********************************************");# K# Y  A: [5 h# T: s! ~
  printf("\t请输入您的选择:");' s) `  M" t3 [' V
  }
! b) b  ~. m# m8 o" V0 g4 L  int save(void)
, i! M( s& F$ W, ]$ E  {' h2 x6 V: Q5 H. r6 E  s8 \
  link p;
# m+ q4 c( G9 z( ]% [+ m  FILE *ft = fopen("date.dat","wb");: R1 s( X. g( g/ T
  if(ft == NULL){' S  h2 M8 A+ ~. j9 p1 ^
  perror("Savd file date.dat error");" g/ O/ i! }8 x6 w, e
  return 0;  j3 U. G4 G( e- F4 ]
  }5 ?3 q% f+ L4 g. s
  while(head != NULL){
3 N$ x" F( w" }  fwrite(&head->date,sizeof(inf_t),1,ft);, a) _4 b; A- G7 ~3 v
  fflush(ft);
6 V& V+ h; @% ]( X. \9 h  p = head;9 o: |( K2 c/ a$ ~: l" l* }$ u. ]0 \$ W
  head = head->next;
1 x* d; ?0 [+ W# v% [  free(p);//释放掉已存入文件的节点& O3 S& _, f6 J) v
  }
8 o4 `* L7 ~; e+ }5 k  ]1 F6 d8 C  fclose(ft);$ E) [0 L8 I% C* M8 {! b4 @( I# `
  return 1;
/ f4 i# g. d& C$ _* y  }
; ^/ f7 L  Y( |- ~0 R  void openfile(void)
0 P, f9 Z5 j+ n, V  {* n$ P$ X" V' X; z$ q
  inf_t tmp;/ D* j; o4 C4 Y# W% r& }0 C
  FILE *ft = fopen("date.dat","rb");
) E4 @6 h- J3 p9 U  if(ft == NULL){, d4 v# }! \  h# a1 u3 Q
  perror("Open file date.dat error");: {  q) c1 Z5 T; x; s) f
  return ;
, W; O' X" p: \$ L  w/ `  }
% ^$ f6 N- [6 V  while(fread(&tmp,sizeof(inf_t),1,ft) != 0){
0 m! R& N* }/ x1 G' w+ j1 D  insert(tmp);( ?- r( x) F1 a( V* @0 t
  fflush(ft);% R' C- `: f1 t( f8 \* f0 u
  }
, Y, s/ Y, i5 V  fclose(ft);8 i- j; U2 l2 j2 F' @3 j
  }# w3 k3 W3 C/ ?0 C7 D" _
  int main(void): s* S% m6 P- ]  u9 L& H; [
  {
3 P/ o5 S- r3 ^8 N% R  char cmd[10],name[15],*pch;# b7 [* o  F* g. `: W, ^
  int n;) u. [4 p( q6 h+ q
  link p,pre = NULL;//p指向当前节点指针,pre指向当前节点前一节点的指针
: c" ]1 Y2 z8 _# o2 W& [  openfile();
, K8 c8 s  z/ e% L( i' }  do{
: x; M+ R% W/ ]! l  men: system("cls");' o8 \: i9 r+ M/ N; e
  menu();
, s( ~( v' S3 T7 l+ p9 K3 o8 {  setbuf(stdin,(char *)0);//清空输入流: E  z" o( U5 y6 ~& h% C! U: Z
  scanf("%[^\n]",cmd);//接受除换行以外的所有字符存入cmd中,并加上'\0'标志
/ @2 _$ E9 g/ S  sscanf(cmd,"%d",&n);- @* e0 i. _! y6 ]6 b$ b
  /*处理当命令不符合条件的情况*/
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 21:48:11 | 显示全部楼层

2011年计算机等级考试二级C辅导实例编程(19)

if(strlen(cmd) != 1 || n < 0 || n > 5 || !(*cmd >= '0' && *cmd date.address);</p>  lable1: printf("\t将此联系人联系方式修改为:");+ ^/ X! Q8 [6 e5 V8 Q% Y9 I8 \4 [* j
  setbuf(stdin,(char *)0);7 p' j- X& x  t- Q0 c& w: H
  scanf("%[^\n]",p->date.tel);/ h) z3 f, R3 s6 i
  /*处理当号码不为数字的情况*/+ ~, R/ i' |! S9 s- Y+ z
  for(pch = p->date.tel; *pch != '\0'; pch++){
. P9 p9 i1 [# }/ O* G  if(*pch < '0' || *pch > '9'){: B/ {) e6 }: R' P% G% ~
  puts("该通讯录暂只支持纯数字的电话号码!");! C6 R) I1 N, d9 M/ x+ k
  goto lable1;
7 Q4 x# o4 t# B4 z( l  }
# V$ u, F! ?# t4 m9 \  }# s! G4 D3 o' ]& N/ C% Y4 \
  puts("\t修改成功");
+ N! H" Y" a$ _+ U  }, ?- S7 i7 w  M
  else puts("\t未找到任何相关信息!");: K- i6 ^9 a. |2 R7 p
  break;
! z8 t& q  k$ L9 _" _3 N  case 5:system("cls");output();break;4 \4 s4 m" q! {6 ?5 O( G4 T
  case 0:
0 @# v/ U: n% X7 W- A+ b  y  if(save() == 0) puts("\t保存失败!");
( O& Q/ Z: ?- Y8 o0 m% r  else puts("\t\t保存成功!");1 r9 L! ?$ o0 t
  return 0;
& u5 w8 l2 ?1 k) ?8 a- |% `  default :break;
0 P: B+ U7 [) [0 G7 q* b  }: K# N3 u& U& ]
  printf("\tPress Enter To Continue!");' o- c, R' @$ ]) c- ]
  FRESH;9 T+ |7 [7 O2 ^
  }while(n != 0);+ M6 x  D( y8 V$ k! T
  return 0;, X/ ^9 y) ?; _2 e2 B0 `
  }
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-16 03:14 , Processed in 0.215471 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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