数学建模社区-数学中国

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

作者: 慢跑20    时间: 2014-3-10 21:34
标题: 数据结构,清华 严蔚敏,例题代码(自己写的,持续更新中)
本帖最后由 慢跑20 于 2014-3-10 21:38 编辑 * o. b' v  o5 f

  p/ O3 X, ^: j8 F! ]- a% U$ Y计算机基础课数据结构,清华严蔚敏这本书是公认的一本好书。
/ l/ k3 N3 V4 w刚好这学期我们学习数据结构,想把一些例题的代码写一些、既提高了C语言的水平,又可以加深对数据结构的理解,为以后打下良好的基础。
- f3 a6 X) @  ^3 A9 B9 K' E
作者: 慢跑20    时间: 2014-3-10 21:34
本层占楼编辑
4 c: i! y' L. J( ~
作者: 慢跑20    时间: 2014-3-10 21:35
20页,例2.1 A,B两个集合,合并成C集合。
* ?, C! I5 M8 A" }这个代码是用数组的、算是比较简单的。8 U" s' v& R& T3 |7 E

& E" ^# q6 }+ u5 Q- Y#include<stdio.h>
/ H2 M* M' E, {int L_length(char []);
) g1 U2 s+ a4 Cint main(){
; b; n; X4 A& Z/ }0 r- V1 H) n        void Union(char [],char [],char []);
# N4 d% `$ d" I9 L$ f
* ]% R  x9 e6 G5 v9 k# u) ]$ N        char a[10];
" ^. d4 Y8 s! R1 Y3 P: d7 n" b( |6 C        char b[10];! v+ p# _- j0 _* s
        char c[20];1 [, N. g0 a8 C
        gets(a);
' j- h) c# H" E+ q6 Z; x" D7 K! ~        printf("输入的集合A是\n");
$ G6 P8 z6 G0 X5 M        puts(a);! k' }0 a% M) \, _5 F

! Q. ?. s9 f* i! X' Y        gets(b);" }! l5 n3 b8 j% P! P6 P
        printf("输入的集合B是\n");, `( n" S2 J7 x; q  y
        puts(b);5 `7 \* d* A; U1 j' F0 |; k% D* T/ P
( u" e& P5 f! G) Q6 f% v
        Union( a, b, c);
, t& Q0 }% J5 o" [0 B( [        printf("last得到集合C是\n");2 W- Q/ k' [- G/ D! D% Q& x
        puts(c);' M; z* a+ \& z! }& H
        return 0;5 T( d8 X6 t4 o' m0 D; i
}4 d$ X8 x& l# n! b1 t

1 J( x% N% B, mvoid Union(char a[],char b[],char c[])
, V5 J; L/ ]' w  ]  W3 [, k6 Z1 P{2 @- d) d. N( y! Q3 ^2 v) Z; J$ [
        int flag=1,t=0,i,j,m,n;
5 d" Y+ b/ Z/ j8 W2 V1 c( I        m=L_length(b);
- k3 r$ u' J# p; V& t        n=L_length(a);
# K9 z3 H0 `0 \+ Z/ z: Y        for(j=0;j<n;j++)+ h; _2 ~; f) V  V0 F2 x
        c[j]=a[j];$ e* N  y0 k  V' ~
        for(i=0;i<m;i++,flag=1)                        //i为b数组的下标,m为数组个数;  j为a数组的下标,n为数组个数;
. A4 C. K0 h" K3 P% v. b$ c                {for(j=0;j<n;j++)% g9 i+ z% d) d! J
                        if(b[i]==a[j]) flag=0;//flag=0,说明有重复的了8 w3 [( `7 c* S# D$ {
                        if(flag) {  c[n+t]=b[i];t++        ;}
# z$ _7 j  \+ X4 n9 f1 ?. V2 T& X                }( U0 P4 h: @- n
        c[n+t]='\0';' O# T) m6 J$ Y" Y

/ U& |8 H/ p# Z" n+ \}% z5 V. z% U* H. |. O- H

  t  v* `" D5 [7 _9 x2 gint L_length(char a[])+ W+ w* t+ `7 ^! @" t' s$ b" {
{6 \; C' K  V. Q3 l& i. D
        int i,t=0;;* M0 [( t* C' t/ u$ T  n- f
        for(i=0; a[i]!='\0';i++  )2 W: i0 P1 X6 {9 s, l: G; ~$ D- E; I
                        t++;( U8 R. h" }; w
        return t;" ^8 V/ L! n& y: W
}
5 X" d% W9 m/ U# G2 U' M* q7 l( K% w2 M" A5 \; n# W5 @0 k" I

作者: 慢跑20    时间: 2014-3-14 09:32
本帖最后由 慢跑20 于 2014-3-19 13:53 编辑
( }+ s* m' Q% g
, {7 j* P. j, l8 L: q& P! ?li2.1yong用指针:
* i8 Q! J# ?" i" H5 W$ @
7 K5 S+ R" L3 T4 f#include "stdio.h", e3 h; z" ^1 I# l* f2 [' `& f% U* `
#include "string.h"% T9 O2 W& t9 B* J1 L% ], x
void Union(char *a,char *b,char *c)
& b3 S/ X% ~% c{' p: X  T. Z+ v/ c6 j. x" U
char *p=a;
; [1 _+ P0 |. B3 c) M/ Bchar *q=b;
9 k& o: K# k# q4 Kchar *r=c;
; G' J# n/ h/ _6 nwhile(*p) *r++=*p++;+ g0 L/ h0 e7 [2 M8 C
p=a;
9 F; |0 ~' E- a+ r2 qfor(  ;*q!=0 ; q++,p=a  )# n% Q9 |3 _! `$ n: ]1 _& l
{while(*p)+ ~% G; _% l: J0 v$ V5 _! y" z4 G3 d
if(*q==*p){q++;p=a;}+ l7 L6 Q% ]. F& ]9 u$ k$ A( Z
else p++;
% j& A, M8 c: ?* X. _: ]*r=*q;
# e$ T! p& u; {# N' rr++;
( W2 `* p/ O7 L6 d% \5 J}
* W  f/ j: ]6 |3 z7 h- m, F3 b4 Z*r=0;$ B5 s+ C8 E% h9 v+ Z* G
- w( u/ H, {! r+ `, D0 e' v- s
}
6 V: o+ J) G6 n/ ?' @9 h3 m4 u
5 r0 W: n& D- U) Lint main(){
% h) U3 a: |7 R" K, B" k
+ I9 l$ U( O; t8 y" hchar a[10];4 `( I' s. ~4 \/ r, R
char b[10];
) u* C/ J/ P1 i; `7 j% [* Ochar c[20];- U* a; v- |- c2 }
gets(a);8 J# X% Q/ s! g' n. s
printf("输入的集合A是\n");7 g# ?' ?) J/ D" i* }
puts(a);
' Z8 H8 N9 A; ~. U+ S- W$ D
; R$ u3 W0 B# C4 ?3 N9 qgets(b);
1 k- I# Y- y4 r; [printf("输入的集合B是\n");5 y( v( s# L( a4 S/ c' C) l
puts(b);& ]& M" D5 F- ^

9 Z# `: U! D5 z" FUnion(a,b,c);
% _; e3 x+ y7 @printf("last得到集合C是\n");& x- h8 @( B* S' w( E' N4 _$ ~
puts(c);
9 c9 W5 _! I# T" r  Hreturn 0;
1 V" P2 e% d5 d1 g$ \7 _}
) ?5 h+ q( c8 W1 ?! R5 c6 H
作者: 慢跑20    时间: 2014-3-14 09:33
第2章最后开始用链表了,由于以前没有接触。这里要重新学习链表:
& v+ F* S6 l# I% J* f#include<stdio.h>
6 Y5 n( d6 K: A  o- T4 R' T9 s9 Y" p, z* c* a) S4 U% A! `5 @
  struct node
. u, z$ A7 `) o/ i{2 U8 ?9 t, y) V6 L# M
        int data;% A) B2 m9 k& I" A( r1 D& r
        struct node *next;
) [0 l5 j1 S$ W& h! X9 x! m' b};
6 Y2 o0 L9 k! i& S//typedef struct node NODETYPE;. S' L; {: |5 f8 F9 V
void main(); I  Z2 f5 m; R3 D) [! D
{
' P+ w" t) x; J0 [; o        //NODETYPE
& n. m% Q4 ~) V1 t8 a        node a,b,c,*h,*p;: f) X6 a3 L1 T' {8 W$ _
        a.data=10;b.data=20;c.data=30;1 [" ]" Q0 y7 U$ Y7 K! Z- }
        h=&a;1 y4 M! w; N. |9 f  Z$ x
        a.next=&b;b.next=&c;c.next='\0';
( r# ~: w( B+ H* d/ _" t  I  c1 Y7 `        p=h;
$ u. \, j3 h; g9 P5 m9 g$ T' r% |        while(p)
- m2 |6 s- l# V        {* ?& O5 R; z! s! e" Y1 V+ n9 e
                printf("%d  ",p->data);
: O/ j8 g- j8 Y: {9 y# e  M) H                p=p->next;8 b/ k) G3 O. i
        }2 K$ k. o. h6 K+ Z% j% K
        printf("\n");6 {; Q2 n3 f. z% h. c% |4 I
}
! H# G+ D8 [  k) s
' u" W' g9 T- z& ^这是一个简单的链表。从这里可以了解规则
作者: 慢跑20    时间: 2014-3-14 09:38
此代码为生成一个链表的代码:
9 w9 H* I4 X4 C: \#include<stdio.h>+ K/ ^3 F6 y4 R( h$ p( N5 D
#include<stdlib.h>; v/ C5 t# f6 E0 m$ `! [
struct slist
& v0 G5 R( I& \' H{' r! T# x0 O, R; k/ R" e
        int data;  E: n" O; x& r. @  `/ ^  {
        struct slist *next;
7 J" n5 D# @7 B8 V# q7 {2 \3 P+ r};
: X, n$ d, Q# Z# }; k2 H, |' Ctypedef struct slist SLIST;
) U( k) I# J2 j: `. \$ @, aSLIST *creat_slist1()
, n4 h5 N! p0 _1 ^9 M+ Z{3 K+ d# U0 [; q+ i
        int c;
/ ~! W- P2 a$ ~3 A5 W9 ^6 i: ?. D$ ?% G        SLIST *h,*s,*r;- U  Q# N4 F2 P+ Z
        h=(SLIST *)malloc (sizeof(SLIST) );  //生成头结点) I4 P  X6 Z9 T: |9 G! @% O
        r=h;' I1 O5 Y& S, m5 [- S) ?3 [4 G) L/ e
        scanf("%d",&c);7 T3 v( ~( R; e' @
        while (c!=-1)                                        //当输入的c为-1时,代表输入结束* F" V1 i! C4 q7 q7 r! D
        {' T) p1 v% w& k% M& }4 T
                s=(SLIST *)malloc(sizeof(SLIST) );  //生成一个新结点( _$ W" V( i  X2 ^& [5 c
                s->data=c;' f# i) p& |' X) x& H1 W
                r->next=s;; s. w' ?$ p. \5 q% J  y; r
                r=s;' h, J2 P1 f9 t/ D/ |- _: d
                scanf("%d",&c);
, g. `( G  j$ Y( j& f4 V         
$ H! r9 _6 l1 [% r  u  K/ o        }7 B4 }8 u7 F) h) }, i
        r->next ='\0';
: U! O) Q9 j4 N, Q) @; m% j        return h;- O5 ^5 p; L! g& V( q3 _
}
/ P) @1 K+ u3 a1 K& c( o' @4 k3 H) D- v3 |8 p) ?' ~% w4 r& P
/*
- w$ O) t3 S7 `$ T7 c/ [printf_list(&head)4 R: I# k3 r" |2 f! g, r
{        SLIST *h,*s,*r;
: \# E" V7 N) `& v# L, q# m6 s! X        int c;
1 J7 a/ Y$ R& y$ M        h=(SLIST *)malloc (sizeof(SLIST) );
, ~% p6 b/ _6 Q  `& D        r=h;
( ^; ?  Y) r0 V2 n$ x1 x* P7 ^        s->data=c;
0 E4 I) `; V) i' P2 T9 d( R        //scanf("%d",&c);8 |$ f7 A/ d) `3 D7 i* |/ O0 p
        while (c!=-1)# B# z/ _/ q) P/ }. R8 X. [
        {
; I1 _& Z$ V8 {1 L3 T                printf("%d",c);/ W, A8 [! x  u% [9 m
                s=(SLIST *)malloc(sizeof(SLIST) );
& y, m- A! \( _% m0 X                s->data=c;
% [: z! P9 Z2 _/ y5 E/ N                r->next=s;) U' |% G8 D- v. b5 e
                r=s;* b5 z3 I3 ?  E8 i' U& y9 k7 x
               
7 ^, O$ Y6 i8 C5 h/ L# m# r         ( {  I! U" e# \4 a
        }" M, O  _  T- N8 v
        r->next ='\0';, Z/ `+ k/ R4 f
        return h;
% R3 x! q3 h+ d}
: w$ s$ s& p2 D*/
% P9 T" P; M: O2 l; s7 Svoid main()
% z  p% @& e+ D& w9 L; D* V) G{ SLIST *head;+ Y& g  Q5 I! i0 }6 n
0 C' R! Y2 }: W* X
head=creat_slist1();                //调用链表建立函数,得到头结点地址
1 {. ?) e- ~) u# W5 S; Zprintf_list(head)) l; }# D  P( d3 E3 q7 `8 }4 q
}* i6 l2 S2 W% T

作者: 慢跑20    时间: 2014-3-19 13:54
2。4节需要用链表计算多项式的加法,因此,熟悉结构体是非常必要的。* w3 q6 z% {) G) o$ P; v

8 d. J3 S* h2 P5 h: _6 @" b* X% b9 Z#include<stdio.h>
; c3 R+ f4 g$ H8 V( \, h #include<stdlib.h>  u3 J& y4 z1 S1 E  F5 Y8 ?- C6 f
; [- g1 j- N5 x* ~$ B
struct slist
2 ^" [# L& o, v/ \7 E2 o9 c8 U  {- s+ Y8 ?: d( ~, s5 D$ u5 I
  int data;( p' Q/ u5 B1 Y# _# I$ I
  struct slist *next;7 C: E, c3 J: b" X5 E( i
  };
1 h8 @" o# e( J/ K8 l0 S  typedef struct slist SLIST;
  j- f! |7 _% ?; h" X: P
0 O3 ]6 b, X+ B SLIST *creat_slist1()8 ?5 N2 ?3 T0 V
  {9 q8 A& |: z' l2 y$ u4 V
  int c;
3 p% _5 t7 w; ?4 q  SLIST *h,*s,*r;
) ^7 P( U0 D! i  h=(SLIST *)malloc (sizeof(SLIST) ); //生成头结点0 p+ @' ~8 {1 e: Q
r=h;
1 X. Y1 y3 G) h* ~9 Q+ a  scanf("%d",&c);
6 x1 n) o. z& q! }6 ~+ Y: h  while (c!=-1) //当输入的c为-1时,代表输入结束4 F6 x6 V5 }# M* h  Q
{
% c1 j8 @# n: Hs=(SLIST *)malloc(sizeof(SLIST) ); //生成一个新结点
" T( i  A5 S4 g: Y/ E, U) w. K# qs->data=c;3 B8 A+ u4 N- `- ?, |
  r->next=s;
* |( V2 a' f5 A5 F7 ]  r=s;
$ e+ y  u, z% @: z5 W  scanf("%d",&c);
7 E! f/ t7 q( c# W# P + S' _9 A+ C) w& d
}6 u7 A; u- X) d- x5 i6 |
  r->next ='\0';, m: \* t  \7 A' V4 F
  return h;4 P' \3 a2 @7 l- [/ l1 y
  }
( n! ]2 Y: I# b* j0 `- E 8 @3 F$ s5 r& [1 |! q4 O( \
/**/  //想加入一个函数,在刚才输入链表各个数值之后,再输出这些值。如何写呢?
0 q7 f% e2 e7 z3 e" vint printf_list(SLIST *h)# U' A& }; u% o7 ]8 Y0 p3 B
  {
  B& r8 G! s. ?/ Q7 k  //while (!h->next )//教材上经常使用这个语句作为h->next是否为空指针的判断语句,但在VC++里边,这一句与下边一句效果不同,具体原因还不清楚
* J, Y  }# u, @# B9 r! a  o1 ` while (h->next!=0 )8 e1 R* g% d& ?4 q" P* f  o
  {# j5 \  k* `5 ]/ |& [% Q# P! ^- y9 c
  printf("%d\n",h->next->data );2 _, m2 v' H( T
  h=h->next ;
  \2 t5 Z9 i3 Z  }
, M$ ^$ h8 F. w6 @5 T  return 1;
5 w& x* w* I$ B& h8 q* h  }, W* G5 l' f4 @$ N. M8 ], y- c: d
  /**/
3 R% p+ f8 S* K; ]3 ] void main()
( {& t* F5 t, y1 G) {, }  { SLIST *head;' C$ @9 b' @/ n+ `+ b

; ^; f) a/ @7 \. T2 uhead=creat_slist1(); //调用链表建立函数,得到头结点地址
( M; p6 S7 t. c' k$ h) B; Lprintf_list(head);" C: V8 C' [2 d& m
  }
( y' E9 l  Y- v# r% [% s  a9 G/ M( O  M
; j4 D) T7 |/ ?  O! s* [
此函数功能为:输入链表中的数,然后依次输出。




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