数学建模社区-数学中国

标题: 数据结构,清华 严蔚敏,例题代码(自己写的,持续更新中) [打印本页]

作者: 慢跑20    时间: 2014-3-10 21:34
标题: 数据结构,清华 严蔚敏,例题代码(自己写的,持续更新中)
本帖最后由 慢跑20 于 2014-3-10 21:38 编辑 9 h  [8 X3 ^0 M( m( p4 O
( v( @; S* o2 g" E# p% l- }
计算机基础课数据结构,清华严蔚敏这本书是公认的一本好书。
# _- I9 Y' Q8 z. y/ M7 A7 J刚好这学期我们学习数据结构,想把一些例题的代码写一些、既提高了C语言的水平,又可以加深对数据结构的理解,为以后打下良好的基础。
5 w/ s; e8 B' C5 p* g$ Y: r
作者: 慢跑20    时间: 2014-3-10 21:34
本层占楼编辑. F5 X' @1 l, m9 L

作者: 慢跑20    时间: 2014-3-10 21:35
20页,例2.1 A,B两个集合,合并成C集合。
7 D( f( ^6 J! W2 ?1 q; C这个代码是用数组的、算是比较简单的。, X9 D# Z' |" U2 p( l' N4 A3 e6 Z9 L" V
2 l" L" n2 E3 j9 A! a
#include<stdio.h>1 U# x, ~4 b, o. w. x( G; D
int L_length(char []);# I0 C4 f# T$ h# m
int main(){
+ t2 z# U& ?& S" Z' [; x        void Union(char [],char [],char []);
0 r8 v3 K1 X! k9 @1 d5 R, K7 m7 t
/ o  x( Q9 H2 v5 P$ }        char a[10];
/ H' p/ [* l# V2 ~, r3 p' f5 l        char b[10];
4 P. A$ k, |" d+ E$ p$ g        char c[20];
% u! e6 H" R/ Z% W5 m" P: s        gets(a);
$ A# v) f2 S0 @. p        printf("输入的集合A是\n");2 D( f) q4 f$ @% r2 ^
        puts(a);7 b& @1 ]- O# Y) E  m4 c8 L9 g7 `$ a2 E
  S, t1 }5 U. Y8 ?7 T6 z
        gets(b);. [7 x6 M) d& j! K' w( y
        printf("输入的集合B是\n");
2 m  @) x3 J/ O3 O        puts(b);
/ K: C; g) S7 K8 Q# H
% T8 k3 }6 {( f( J! o        Union( a, b, c);
' H9 C. ^! K1 R) ?. x& g        printf("last得到集合C是\n");% e/ |0 V! g3 w" z# Q) V; d
        puts(c);( O1 z* z' A& O
        return 0;
( D6 [* G/ a! n$ s}
* L& }1 L: V7 d' O( A( z# U# @1 E+ \$ x; j% d% w( w4 ]  }1 M7 {, y, b
void Union(char a[],char b[],char c[])) S8 d; t  `& O; U) m& ~' u  V
{
7 H/ \1 T# R% b2 L        int flag=1,t=0,i,j,m,n;7 G0 V) e! S0 L8 r
        m=L_length(b);
: ]9 a& N1 Q, a        n=L_length(a);7 l* W) R  S4 e4 E' D
        for(j=0;j<n;j++)6 p- R3 u% u- C
        c[j]=a[j];) b% l& b" d/ {  w* z7 {" }
        for(i=0;i<m;i++,flag=1)                        //i为b数组的下标,m为数组个数;  j为a数组的下标,n为数组个数;5 U# _" H/ g2 ~3 `
                {for(j=0;j<n;j++)$ d) o3 W. W, s) `* A2 J4 @
                        if(b[i]==a[j]) flag=0;//flag=0,说明有重复的了; W% C& M7 O) f* n4 G$ q. B
                        if(flag) {  c[n+t]=b[i];t++        ;}
; V  T* l' ^% E9 z2 p                }
6 |+ G" B5 W1 K" J        c[n+t]='\0';
( r* z; ]6 T" f: j  F! E3 P
( q. i3 y3 \: K* ^' i6 i7 Q0 F9 c: D$ V}
4 R1 e) q5 ?, _- [7 E0 Q. c/ H1 ^7 N; A
int L_length(char a[])! M& ?( k  v4 ~1 e3 n# }& I
{- ~  }& c5 o' B! q/ H/ U
        int i,t=0;;/ E5 J5 ?  o+ f3 h( V$ `5 Q! z
        for(i=0; a[i]!='\0';i++  )
: [# w1 W5 y2 h: q# a2 @7 l: h7 ^                        t++;
9 Z7 [; S" Y$ h" }' y  K% }& X; S        return t;# ?) j$ D. B* Z0 E, O/ e0 J
} - @: r0 C- ?3 H/ N$ k. e! M7 @
* J; j% a& J% b9 f

作者: 慢跑20    时间: 2014-3-14 09:32
本帖最后由 慢跑20 于 2014-3-19 13:53 编辑 / f' |' w) Q" ~7 u8 w! g

- U  L" U/ Y7 o4 n  E9 w" Rli2.1yong用指针:( {8 H& O7 B0 g0 E! _% H
6 ^* p) H2 l$ @& D1 g. P. p
#include "stdio.h"+ C* P* x# z  ]" b* z
#include "string.h"% A# }1 f; X- R9 I0 F  s2 b
void Union(char *a,char *b,char *c)
5 N2 Q1 t9 [- h1 h' L{
) Q1 N! S2 _4 |% ~. u6 ]# ?: _: c/ Hchar *p=a;
; ~) u( d5 Y6 C0 O. x# K% m; ^  r! Pchar *q=b;
2 w3 L6 J- l0 G: n& A+ ]; {char *r=c;
. c# p8 T' P9 \2 j5 \while(*p) *r++=*p++;
* s5 A7 I3 e9 L6 Z- K$ d3 }p=a;
) Z- R" U2 s5 l1 V9 N/ C6 Zfor(  ;*q!=0 ; q++,p=a  )! \/ |9 c) p2 k" S8 k
{while(*p)3 B- ~' ~1 a0 L& e) M$ a
if(*q==*p){q++;p=a;}
4 u7 y/ S% i5 n3 n# _else p++;
) u- [" \1 N) @, E1 n*r=*q;
/ ]- F+ s. f$ k; {" T. Ir++;  @4 ^) D& j! I7 Z8 V. P
}1 p- _, w: N: H8 E. l: ~: j
*r=0;; {6 c2 x  s$ T+ S' b3 z

/ N" W2 k2 l6 n7 H' _/ r  l7 C, H, A}" L4 U" R5 t( Y# Q- F0 z+ e/ f+ `
% j/ h: ^( K0 D. }0 ^
int main(){, u$ k" ]8 A' z, B+ ~

5 ?: k! o, v) h: O8 e  n) Achar a[10];; n- I5 \( p  P* X
char b[10];
" q; f& _7 _% P, c. xchar c[20];* Y# |: K9 ~+ |; V
gets(a);
2 ]5 }% [4 h' l* k% J& jprintf("输入的集合A是\n");
  a0 h% A1 O. k3 c, }" Yputs(a);
1 x. Q. s0 E" o
5 j* p2 E$ |" c7 R4 Agets(b);. O7 g$ z2 D" N+ o+ D0 I8 H5 P
printf("输入的集合B是\n");4 A# g  `' t; c0 Y# _5 f
puts(b);% P; V: E# C! a( a# `- h+ r# Q" N/ K
$ E5 q; x" U/ f7 g5 T' z
Union(a,b,c);8 `4 v" b' F/ @1 }& F
printf("last得到集合C是\n");
$ d9 c5 o6 ^% uputs(c);
- L5 [" W* k; V+ r4 Breturn 0;9 J2 j9 @3 ]$ o' q7 w
}& [2 V' B- \: @& ]/ N  A% o

作者: 慢跑20    时间: 2014-3-14 09:33
第2章最后开始用链表了,由于以前没有接触。这里要重新学习链表:
( ^0 Z8 w" r. X#include<stdio.h>
7 h8 {4 M& Q' X# j8 E/ Q
/ v) o; y% z3 V/ B  struct node/ H5 Y) E( N# o# E! E
{
  U5 g8 _6 W4 k1 N( |+ e7 y% `        int data;
0 Z) k9 y9 i; j) w( W- ~4 v        struct node *next;, \: E2 c1 i9 j& g+ W# _  Z
};
3 A7 r' P, b+ r//typedef struct node NODETYPE;
" n0 ]( L  d; i) [, Avoid main()
, `+ W/ }: G0 ]{. Z7 O; |3 |+ Y$ P" x( t# x
        //NODETYPE3 Z% _0 B+ ?+ z7 @9 Z
        node a,b,c,*h,*p;8 \- J% [# G6 T" Z
        a.data=10;b.data=20;c.data=30;+ P# o# \7 J3 u  p4 v& ^. w
        h=&a;1 h) d( T5 t0 r6 Y, ]
        a.next=&b;b.next=&c;c.next='\0';
% f3 x( K9 S0 {1 A- x0 B% v        p=h;
. i7 [/ f0 _( M        while(p)
7 E7 B: r; F& s: \        {
5 @; K  \( }6 n; K7 O  q( ^                printf("%d  ",p->data);
1 ^* Z! V% d* {* B4 l                p=p->next;
3 |5 S0 e' c) e( E        }$ }/ m. T' J, ~! Y$ u0 u6 \9 K2 w
        printf("\n");8 J  ~. f4 E5 u; h) F6 R- D4 x/ ?
}
& {6 c2 H9 M! i1 h
" z4 [+ M. q& s/ @* h; i这是一个简单的链表。从这里可以了解规则
作者: 慢跑20    时间: 2014-3-14 09:38
此代码为生成一个链表的代码:
% Y( c6 h7 T7 W) P+ k+ E#include<stdio.h>& V4 H! a  ?8 ^  G& F4 F
#include<stdlib.h>
. h" m& `9 ?; ^# q/ j# Istruct slist
  P. Y6 G+ N( s  }{7 ~5 o( n& J. F2 y: o! L7 i( n5 t
        int data;
; G% T3 J' Z( B$ w0 z! L        struct slist *next;/ L1 @& U; r/ L
};
: q5 G. E, v2 q- A* D- R$ Qtypedef struct slist SLIST;4 e% g4 U7 Z/ c4 j
SLIST *creat_slist1()
6 g9 k) B/ N( S0 M: c4 Y5 C{' t( y: E& s( |0 y  P
        int c;0 k6 }0 t7 }! y6 R
        SLIST *h,*s,*r;
+ X0 k* ~/ e' A- f; F% f) _        h=(SLIST *)malloc (sizeof(SLIST) );  //生成头结点
* k- `3 F& r" |5 T( a; O        r=h;
4 a4 `7 y" |  [) a        scanf("%d",&c);
' S5 u/ \& u1 R: t* L" ^        while (c!=-1)                                        //当输入的c为-1时,代表输入结束
& N8 s' R& z) K% n& k/ K        {" N6 F* v& D. m( @. U: D0 @
                s=(SLIST *)malloc(sizeof(SLIST) );  //生成一个新结点# ?7 A: _7 w( ?. E' l( `
                s->data=c;* g5 z7 p3 |# g0 R" S
                r->next=s;
( `1 X, ]3 ~1 O  v% O8 h                r=s;
) u( E5 q6 J; n                scanf("%d",&c);5 \% T" G: z  g
         
! m, @* W: i' P2 [/ r& Q% ]        }; D3 f. D9 P0 w
        r->next ='\0';
: F6 p$ `3 d6 e+ E* l        return h;' m$ ?, {3 C/ M& t# d/ N
}5 ~8 H( ?1 L4 b: {! B& K

6 j. K' ?" ~0 w7 s' x6 K/*
. a& r9 `5 W# {$ a1 A. w6 Kprintf_list(&head)
8 ?6 m' }( s8 _* n& k+ y- P) Z{        SLIST *h,*s,*r;4 W+ z2 S; G/ D( k" ~  @; ]
        int c;
% q/ d& W( S+ v9 P        h=(SLIST *)malloc (sizeof(SLIST) );
2 S. k. G. J& y8 ?3 T        r=h;
9 e. p* p! |; [( \  P        s->data=c;
! H% w1 Y8 E: ]0 w3 D2 i        //scanf("%d",&c);
7 D' {8 h( \, g        while (c!=-1)
0 ?. e2 v6 P* I$ Z9 _% u  t        {$ u3 F/ E7 L4 _
                printf("%d",c);: q- |9 o. f# f9 q
                s=(SLIST *)malloc(sizeof(SLIST) );" ]- O, S8 {$ C: d/ c  W4 E9 E# r
                s->data=c;
9 i, Q% J' P' s# U% o1 X) ]) u                r->next=s;
% h. S, o+ S! x7 z                r=s;) T+ e+ \" x- Z; N  Q: q
                # o7 |, M9 p+ W' F: i8 M7 X
         
! E6 j" R8 n5 c' ^( S( D" L3 v        }
  Y3 K5 I) x- v* ]7 C" o        r->next ='\0';! b, B3 [$ M9 N+ V6 B  j7 I
        return h;
  G1 h1 _( D/ s" Y6 l}
. t& Z5 O. |! I$ p*/4 k5 Y' p- e0 D' R+ @" H. _9 r8 n
void main()! B2 v6 ^/ T* w8 a4 b/ o" \, r
{ SLIST *head;
( Q6 v: Z0 V9 j, p- O- W1 c! v, y$ n) F, V
head=creat_slist1();                //调用链表建立函数,得到头结点地址. \0 f5 D1 e- S  A9 N
printf_list(head)
4 x. H: x/ l* L& {2 s6 ?3 n}1 s# E9 d3 u5 A

作者: 慢跑20    时间: 2014-3-19 13:54
2。4节需要用链表计算多项式的加法,因此,熟悉结构体是非常必要的。
1 b6 h0 F) [/ B- X; q7 f
) d% c& W8 g# Z6 d+ a#include<stdio.h>
" m/ W* N" A9 O4 N( G5 f4 z0 s #include<stdlib.h>
1 |/ H" ?; w0 y& @8 t5 a8 |* ~- ~ % H& C' |0 D3 N7 j
struct slist
* j; V/ g: A' [: E& v7 G  {
6 S, Y1 ^1 }+ v, \  P# |  int data;! Q) X8 }# s* k8 ^. |. {+ S
  struct slist *next;/ V: J5 T9 l! Z2 E
  };
- U- I9 ^. V5 l8 V$ ~: i, r  typedef struct slist SLIST;& `# o# X6 R4 Y. q

6 N. _& D' ~" @. b; Q SLIST *creat_slist1()
# [1 Q  N# r6 j0 Q  {% f. z- Q8 U/ I; d3 r6 L% i
  int c;7 Q- X& A4 A* @9 y2 M: e
  SLIST *h,*s,*r;
8 N# l& D  S6 E& b5 Y  h=(SLIST *)malloc (sizeof(SLIST) ); //生成头结点( o- g5 X" ]; m
r=h;: r( G: x8 {, [
  scanf("%d",&c);
! x7 S) ~3 ]' R0 j( S& V6 R  while (c!=-1) //当输入的c为-1时,代表输入结束
% n9 S' M0 r0 F5 P9 O{! p6 Z7 m' r5 Q- V6 y6 i9 X: T# V
s=(SLIST *)malloc(sizeof(SLIST) ); //生成一个新结点5 W8 ~1 ~. }; S7 l# t
s->data=c;$ F  B6 t! y8 Y1 X0 n+ B
  r->next=s;
. z- I" u5 S- }8 W2 W3 {  r=s;+ v6 v4 C/ q  K" G
  scanf("%d",&c);% w! B7 H  I" u, s, H
8 ?5 {4 l. K& {& Q8 [* l, N# O$ I
}3 f. }( |. G8 |; H! u2 x$ K$ J; u
  r->next ='\0';
  G5 z0 g" y  u2 [6 [) ~  return h;3 t# {- z0 f5 x8 ]; E0 }
  }
2 s% q( |, B0 O( O * V3 D) I' h! e4 P
/**/  //想加入一个函数,在刚才输入链表各个数值之后,再输出这些值。如何写呢?" e1 k. @% L5 x
int printf_list(SLIST *h)3 N  O' ?9 i7 H# B- l
  {
/ k+ Z6 J" p4 J7 E) K  //while (!h->next )//教材上经常使用这个语句作为h->next是否为空指针的判断语句,但在VC++里边,这一句与下边一句效果不同,具体原因还不清楚
' {! l1 `, E7 a7 q1 y while (h->next!=0 )& _7 T- j# J* @5 _6 J
  {) I- A- ^; U4 {: r/ D
  printf("%d\n",h->next->data );, M# t7 v5 D/ e& s$ `. K- }9 O
  h=h->next ;, T  p+ {* u6 y
  }
; c) f6 L; e. O" o4 P  return 1;
2 S, F1 S- B0 Y. f  }2 r" k$ i; t5 t5 R# I
  /**/, u  P! R1 @+ L' r. O) [4 w+ |8 s) ~
void main()
( y3 O0 |4 U5 w1 L( J# l; f  { SLIST *head;
) }/ z# [& i! y) J! U
7 t8 j$ T2 H2 e2 _head=creat_slist1(); //调用链表建立函数,得到头结点地址9 u, |& }' r. `  p( W' X' _
printf_list(head);
+ G' j: b3 S$ U1 \. T4 z  }
2 h7 Y) b+ B# `8 B
" N* f/ I. I, s. {2 M
' B! e3 |: @+ Q7 E& d此函数功能为:输入链表中的数,然后依次输出。




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5