数学建模社区-数学中国

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

作者: 慢跑20    时间: 2014-3-10 21:34
标题: 数据结构,清华 严蔚敏,例题代码(自己写的,持续更新中)
本帖最后由 慢跑20 于 2014-3-10 21:38 编辑
5 M' _2 \" t  n5 B- W
( r" r% V. ?" e% h, n计算机基础课数据结构,清华严蔚敏这本书是公认的一本好书。( U  m8 E# C+ B5 ?
刚好这学期我们学习数据结构,想把一些例题的代码写一些、既提高了C语言的水平,又可以加深对数据结构的理解,为以后打下良好的基础。
: a% F3 K* F! t- h/ ~3 a
作者: 慢跑20    时间: 2014-3-10 21:34
本层占楼编辑
. ^3 c) Q' {" j* Y% X5 p% Q
作者: 慢跑20    时间: 2014-3-10 21:35
20页,例2.1 A,B两个集合,合并成C集合。
" X1 n) P9 D4 Z4 S7 v  G6 Q- J这个代码是用数组的、算是比较简单的。. N4 R5 z/ `# w1 z+ N* _% g6 E

3 b- B( a" Z: g+ h2 ?# X! u#include<stdio.h>
8 w1 Y: Q1 U0 ~3 Q+ K8 nint L_length(char []);
- s8 Z5 |# `+ j+ b! u# f& O  x; Jint main(){4 l  l+ P5 k- G- x$ b3 }4 b6 I
        void Union(char [],char [],char []);
' [2 N2 m+ g1 v" ?& }7 B3 t
7 {9 N+ w9 v, I' ~, Q        char a[10];* o% j* ~- l7 p! o8 i7 ?1 ^
        char b[10];
! @# r! X1 S$ K: a+ x; u        char c[20];
8 K8 U$ i5 ?+ P& y4 S        gets(a);3 S( Y( |+ ~6 }$ R. r
        printf("输入的集合A是\n");, ~% ~: k( G/ m) b9 j
        puts(a);' `6 q, Q1 B( }, B, A% ?
, e! _+ }. V2 Y) S
        gets(b);# U5 L3 B# [6 D, y
        printf("输入的集合B是\n");
4 n5 K5 a! W" P8 k2 v        puts(b);- \- I, g5 T$ J% E" F- b
) r2 f+ z6 J- z0 r- M
        Union( a, b, c);0 u! y& C% O/ g; ^8 w& R1 L+ b
        printf("last得到集合C是\n");' T- D; H& Y: K! \) K
        puts(c);
4 f7 u- q9 M+ ^        return 0;
7 t0 ~. I; u( x5 I8 I}2 Y! f% `5 Q0 Y, y; _  `# X

: _5 k( {' x& T8 H3 m. F$ Wvoid Union(char a[],char b[],char c[])
8 d9 X5 ^3 r* ^{8 ^4 W+ h8 K. P7 p+ b+ h& b
        int flag=1,t=0,i,j,m,n;$ ?/ V. U# ]$ V4 |
        m=L_length(b);- t2 I8 B. O% J5 E9 m; j* L+ X
        n=L_length(a);
3 _. h5 R- G  i1 }        for(j=0;j<n;j++)
1 o( f; S) A1 c; d0 v' o        c[j]=a[j];
" i' r6 e; k4 |; H% ], V: |/ m        for(i=0;i<m;i++,flag=1)                        //i为b数组的下标,m为数组个数;  j为a数组的下标,n为数组个数;
& n; z' Y' }* @) ]: q7 W7 e( _                {for(j=0;j<n;j++)
, e' ~1 ]# t$ \! N  `# `0 b6 L! K                        if(b[i]==a[j]) flag=0;//flag=0,说明有重复的了# e* q$ M  W. d. B5 P: @% h( `
                        if(flag) {  c[n+t]=b[i];t++        ;}- B" i. f4 B  t+ m" \& @6 i4 f
                }
% G: q3 ~9 d1 T# h6 h        c[n+t]='\0';
) `) e9 `& |3 _* R & A3 Y; M% R9 q) O) n* Y
}
" F) Q, R6 \" m* ^- P+ E0 _
2 ]2 o, e! n2 J" a/ w7 Qint L_length(char a[])2 s9 u& J% ^4 b8 @7 r5 u3 V0 T
{. v* z& i  M4 X% n  J0 b
        int i,t=0;;% m4 V  m. E4 S! \' f
        for(i=0; a[i]!='\0';i++  )
! B3 i  G% q8 }$ W* m5 [* N                        t++;
$ w: D+ g" E' G1 j$ s; N        return t;
: x( c0 s. F- }* U1 h}
( n0 S) y  [. |) K9 F  T
# w# [" \( L" w0 P
作者: 慢跑20    时间: 2014-3-14 09:32
本帖最后由 慢跑20 于 2014-3-19 13:53 编辑 7 G" A3 y0 a5 k0 u+ ~

% K8 x9 s3 S/ L1 H' {li2.1yong用指针:
; V0 x5 M( h& ?+ F/ }& h7 S7 D5 U1 c
#include "stdio.h"0 w& U. u' y! d! L4 o1 S2 k
#include "string.h"; ?" Z7 |9 m% Z4 k
void Union(char *a,char *b,char *c)
( ~% E  S* {4 I7 y{
& u9 O+ R6 ~! Lchar *p=a;
5 v$ Q: Q  }( l6 o1 S& echar *q=b;+ M5 O1 |1 r# v( p8 a% T; e! }/ D
char *r=c;2 Z& P0 ~5 Q0 Z/ r; h* ~0 H
while(*p) *r++=*p++;, P* A# m' n8 _, X. J
p=a;
0 x* @& K$ t# E5 zfor(  ;*q!=0 ; q++,p=a  )$ I/ q- k5 A2 Q% T  R7 z# e7 u
{while(*p)1 z3 K' f. E4 D& n6 ~- T3 D
if(*q==*p){q++;p=a;}
$ h* _6 i1 v, F9 d' Relse p++;7 d. s% l7 ]6 t! ]; o9 [" i' p
*r=*q;
$ X' e9 s& y% D1 A% C* o2 Qr++;; {+ l" b) l) J. C3 N- ]
}; v5 V# d! u- j. `! }8 X$ p2 ]& ?
*r=0;
, A* e/ [9 r: m5 e+ B( Z  y7 `3 l- k+ \
$ l; Y+ P& p4 l+ ^6 d) Z& c}+ ^  r# V5 B+ r% j9 l( l2 y

/ L" U% P% f- X0 s2 N+ Q# ^+ nint main(){
2 z+ B7 \4 o- N( y4 R
" w5 |( J- t& A" T2 ~& I, k) a7 Dchar a[10];
# x1 A& w4 E) d9 Y0 Y4 T/ Fchar b[10];
0 B$ ^' U5 S8 N2 u. L! t4 \char c[20];& E. _& Q" A5 R. U& d
gets(a);
/ p; w# W7 H! @8 @2 E3 Nprintf("输入的集合A是\n");
+ ?! @" m3 s) pputs(a);
& T6 d) `! r4 F% i; A1 s6 U; ]% h" |2 Z8 \. s" G+ Q2 \
gets(b);
+ E! j% Y0 }, ^: v6 G# qprintf("输入的集合B是\n");9 a% A. ]" B+ G0 M* h+ J9 c: S' l$ v
puts(b);
7 f- z* p! {; _' @5 ?3 ]. P: O$ I4 M; }- j' Y! R
Union(a,b,c);$ b0 V$ c  P* M7 T/ h+ Z2 x0 V
printf("last得到集合C是\n");+ j/ Q# r( Z  f0 y( i
puts(c);
' J) e3 L( e  Q, u6 j, preturn 0;
" a0 k$ t" o4 H# W}
+ s+ `/ ]9 D( @# d" m" @
作者: 慢跑20    时间: 2014-3-14 09:33
第2章最后开始用链表了,由于以前没有接触。这里要重新学习链表:
& e' J' u- l3 f9 q0 |; J6 L( X#include<stdio.h>
: b3 }' S  q4 C) n3 X* d% o4 S' n4 @# c8 u2 k4 N; ?# J
  struct node
" K0 O" f! O2 s! b8 ]4 }; }6 m" [{6 s0 {1 Z0 d4 k! I$ k1 r+ Q
        int data;
" _* o  q% u2 f5 y( p2 R        struct node *next;( `3 d8 ]) A! T. w- ?% v* ^
};3 o' O# v9 e, v& a! {8 q* j* M0 b
//typedef struct node NODETYPE;
) |  i( y3 x; h8 F& ~- yvoid main()
2 A; [' y9 Q; m5 V3 z0 w3 ?/ r{5 A$ n$ L. ]% h% J
        //NODETYPE5 }4 M, U0 {) Z7 L& _
        node a,b,c,*h,*p;
( j! P4 O1 N6 r/ q        a.data=10;b.data=20;c.data=30;& g/ n4 e' K& ^5 I; e) i
        h=&a;# M; r6 e+ G/ T) p
        a.next=&b;b.next=&c;c.next='\0';0 ^6 M; N& R  q
        p=h;- F3 D' R1 x8 D3 d+ M7 r: W7 f
        while(p)* x; w6 f7 L- o: x9 Q
        {0 O' K) u7 h4 @+ M. M
                printf("%d  ",p->data);
3 l& N& H# E+ f5 C+ I2 `+ P                p=p->next;1 j4 w; ]( M* U# M, a! H! i6 R: T
        }
6 g( F: J& d5 @3 C( n5 P$ q        printf("\n");
0 H# w: M, I% u# D, }# Q3 {}/ C6 r' y. i, a! a+ n
9 T2 P1 ]9 R+ S% o* _' n$ N
这是一个简单的链表。从这里可以了解规则
作者: 慢跑20    时间: 2014-3-14 09:38
此代码为生成一个链表的代码:# {/ {  j, }2 Z" P6 B
#include<stdio.h>
) |& M+ s, ?/ c% j#include<stdlib.h>; k* S, |$ z, i1 W8 V/ G" w" I4 Y9 m
struct slist& ^9 s: k( F' P7 f! M
{0 L" Z1 X- k2 z2 A. V8 x% U
        int data;- u2 J( Y! o7 p6 j# b
        struct slist *next;) t2 q1 E0 d+ K9 R
}; $ k3 D" U9 L% p3 ]$ u+ n
typedef struct slist SLIST;) L  T; }1 y/ e) v8 k" `& h* P9 p) {
SLIST *creat_slist1()& e& l( t/ S, M& ]1 O
{
! p: _3 _6 `) l  {& H  L        int c;" T* H$ ]& Z2 T7 U0 u4 ~4 A
        SLIST *h,*s,*r;
$ \3 `+ W9 E- C5 f$ t$ \        h=(SLIST *)malloc (sizeof(SLIST) );  //生成头结点: t7 ]8 ^& t7 K
        r=h;
- ?* `5 d' l0 e' L+ \9 Y        scanf("%d",&c);
+ X/ i$ N2 ~% s# F5 F- Q        while (c!=-1)                                        //当输入的c为-1时,代表输入结束5 k" r$ }/ L! y* A9 i0 w. ?
        {
% V, b( r: v" t( H$ _                s=(SLIST *)malloc(sizeof(SLIST) );  //生成一个新结点; t: P# @: ]( I: z9 n' L
                s->data=c;
+ ~5 T& o. ^  Y3 B2 N# {/ K                r->next=s;
8 n# a2 H4 [- h1 U" A& }                r=s;
0 V9 Q7 F* Z% R! E% A                scanf("%d",&c);
- r: b+ W5 n7 w5 o         . J/ O5 f3 k  ]
        }. @- D% a( ]7 a1 Z9 h
        r->next ='\0';3 q+ d1 J! e7 n& Q8 m1 O0 [
        return h;
; l( H. @% G3 {/ W1 M}3 f6 o! L# W0 @
& O% q8 {, _& }( e3 t) X
/*+ c4 c* m% X8 E, C
printf_list(&head)
7 R/ R- r! J) H6 ?{        SLIST *h,*s,*r;0 H! g& g' M2 L9 ~  ]3 ]9 ]3 f
        int c;: T4 M- g* E3 Y4 D' }: J: g- r( W
        h=(SLIST *)malloc (sizeof(SLIST) );" ]! ^: n3 ~& g- r* z: y7 @# X7 j
        r=h;, I, G8 E: M; d6 G3 W. _
        s->data=c;
- C* s* |0 g7 x* V0 s* z        //scanf("%d",&c);
0 E# ?! ~+ R2 Y# D) O0 B        while (c!=-1)
% _+ n+ m# f  m; ^1 {        {
* f8 J' _: h1 C; q: ~                printf("%d",c);$ U6 Z: @$ \3 t
                s=(SLIST *)malloc(sizeof(SLIST) );6 J6 V$ U5 F* G" \9 e
                s->data=c;
9 ^' e) G* Z; S5 L. \                r->next=s;" y" C" p' X2 p
                r=s;
6 k2 m( n5 W0 M                ' N9 C' m) I  l2 a6 x
         & D! E- F9 T, s7 H# l, @
        }2 Z/ R7 [9 l* j4 w4 K) o
        r->next ='\0';
7 u# T7 i# ^1 V* `# t        return h;
9 R/ n1 e& d# L! C}! h; t: ?3 i* V5 ?2 y; R7 Q& B
*/1 h2 s5 L* C- j: M* s" m
void main()
7 j3 g" c1 R3 d! `4 k{ SLIST *head;
+ y! N5 s% ^* W1 _. L3 m( }' Q7 A; D* v
head=creat_slist1();                //调用链表建立函数,得到头结点地址1 j3 w3 @5 K$ o, S) J. h+ f
printf_list(head)
! w, Z4 V: _. q/ |}2 J4 ?/ d0 t2 p8 b- @: t( b2 B7 \% d

作者: 慢跑20    时间: 2014-3-19 13:54
2。4节需要用链表计算多项式的加法,因此,熟悉结构体是非常必要的。
/ U) m* i7 ?- h4 O( _4 B
$ [4 q+ _2 R& ]$ J' o#include<stdio.h>
1 z$ v3 @3 B+ {5 r$ W2 L0 Q #include<stdlib.h>
( x8 q0 X* C7 \/ T/ U
8 c! Y" }$ n) S( r. k struct slist
6 \4 o9 N2 G8 I# T6 A, n  {9 G: e3 o$ ?( Q" Y) B$ V
  int data;
  Q3 O4 D1 z2 J& o. Q7 m  struct slist *next;
# d! G# g5 V$ U# C. G+ I1 A6 G& _  };
7 i2 e% b8 q# O! G2 ]7 X5 u; ^  typedef struct slist SLIST;1 `- E, z0 n$ W; D) j. Y

( h* J; v9 R* R* B5 ? SLIST *creat_slist1()
) M2 C! o# \) ]  {
& S! u+ S+ S" l3 \  int c;4 @- B/ E4 Z) I  j( z0 M
  SLIST *h,*s,*r;
0 g6 H* i6 h6 K7 [# ?  h=(SLIST *)malloc (sizeof(SLIST) ); //生成头结点9 O" {$ s9 ]+ z+ g8 p9 \$ O) Z
r=h;
+ h/ d; Q) t) \# o4 Y9 f6 E) z  scanf("%d",&c);
1 K0 V6 F: J# t3 }. ?  while (c!=-1) //当输入的c为-1时,代表输入结束
/ d# C. d! L# x9 x6 Y! N3 W{3 t7 f" B8 T: y( Y( e/ @8 [
s=(SLIST *)malloc(sizeof(SLIST) ); //生成一个新结点
! a8 h( l: T! j; d* O+ W1 \2 e& us->data=c;1 c$ s, D& d3 e# V, M* ]. m
  r->next=s;6 c  Q$ p. d: y
  r=s;
2 j- g( d6 c# J) e+ m4 h7 P  scanf("%d",&c);4 [" X! P% Q2 C% W4 s& y( p# ]

( A, c* V, r4 R; A) g}6 {$ u1 f2 J- b! c7 X! W/ s7 H
  r->next ='\0';
4 x' m$ l( |+ i- e1 w" ~- _  return h;8 [' @* j0 |) _; F* d* U
  }
  h* W5 r) @( P$ w , F' M( |5 [* F# C
/**/  //想加入一个函数,在刚才输入链表各个数值之后,再输出这些值。如何写呢?! w+ y0 h; F9 U. Q% S3 Y1 r
int printf_list(SLIST *h)0 d: E, n1 {1 e
  {' g9 e: Y9 x5 l) F/ o6 T1 o  U
  //while (!h->next )//教材上经常使用这个语句作为h->next是否为空指针的判断语句,但在VC++里边,这一句与下边一句效果不同,具体原因还不清楚
2 {, h# [6 ]1 k' Z6 {- H6 O( a5 K while (h->next!=0 )
3 P+ J- C  K1 `0 t6 [  {
2 d- m- Y0 E* f( V/ J  printf("%d\n",h->next->data );; Z% C" k4 d$ c% d5 Z
  h=h->next ;- a; D% l" F+ i8 A! T1 p& v
  }
( a. B! f. Q1 \  return 1;) o. y3 _; g, i- o! `
  }
9 Y+ D2 l: B9 r* i5 U( {0 T/ O9 ?& Q4 [  /**/
6 B0 _" q& Z: u. Q& I- v void main(), N3 ^8 L- C7 o
  { SLIST *head;  Y$ m" P7 \- d$ ~
- G* U' K  @& |
head=creat_slist1(); //调用链表建立函数,得到头结点地址: n7 u/ ]4 n7 ]5 l% b+ g
printf_list(head);
4 _: g0 `2 Z( }9 [  }0 e8 x) u5 F4 {5 H9 O4 Z
" C$ x# _7 f8 y9 N, o: s" a2 B) \7 h+ F
+ m1 F) O: b9 x1 z/ m1 @
此函数功能为:输入链表中的数,然后依次输出。




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