数学建模社区-数学中国

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

作者: 慢跑20    时间: 2014-3-10 21:34
标题: 数据结构,清华 严蔚敏,例题代码(自己写的,持续更新中)
本帖最后由 慢跑20 于 2014-3-10 21:38 编辑
0 {% f6 Q2 c: K- y5 F
  M; ]% g; f& H" X# y计算机基础课数据结构,清华严蔚敏这本书是公认的一本好书。$ z5 Y9 I" n' I2 p
刚好这学期我们学习数据结构,想把一些例题的代码写一些、既提高了C语言的水平,又可以加深对数据结构的理解,为以后打下良好的基础。# X5 D% ?4 `2 }0 Z# j# Z; l4 N7 Z

作者: 慢跑20    时间: 2014-3-10 21:34
本层占楼编辑7 b# U& d/ `( J8 j

作者: 慢跑20    时间: 2014-3-10 21:35
20页,例2.1 A,B两个集合,合并成C集合。! @2 ^( V, }: c& w4 U
这个代码是用数组的、算是比较简单的。
* T) Z) f: b. h2 q  q; Y" O9 [1 m5 h  |/ g+ m0 f# C0 t
#include<stdio.h>
3 H% p6 w0 p$ \/ Vint L_length(char []);7 }% V0 t" t$ w' D# V. J( f
int main(){7 _+ U7 D- [$ k5 \9 W2 f
        void Union(char [],char [],char []);
0 ~6 O. D3 E6 N! P+ p% `! Q( e
  @) Q9 T! h3 r7 B( P( ]* k        char a[10];- J! O9 h  a4 D0 N, W
        char b[10];7 j( q9 H2 Q- r
        char c[20];6 Y  O- e1 w9 O2 r
        gets(a);
, p5 j# S/ \8 e* ]3 M        printf("输入的集合A是\n");1 t$ G& m; h/ y% ^' i
        puts(a);
9 r, t3 t. X8 p" I
8 |6 J: u+ r4 N/ t        gets(b);
8 {; B4 c3 |9 V# B  n        printf("输入的集合B是\n");
; p( f- G' t0 Q- o1 f        puts(b);' ]6 Q- V6 {" }
: H4 a& g, M- x
        Union( a, b, c);
+ {6 o+ n3 L2 e% f        printf("last得到集合C是\n");9 z% Y0 d3 F# Y! A! A, k
        puts(c);
* O9 W" Y, {# z$ K/ J        return 0;
/ @+ e/ V' ^: E' G6 @" l( g5 b}
( [6 W0 Z' [7 A% I- e
9 A7 R/ l' t) W- j$ E% svoid Union(char a[],char b[],char c[])
( M9 p2 ?" @& [( D" v{
: r* g* N& i3 A+ e, {& |3 u# C        int flag=1,t=0,i,j,m,n;* o4 Z( l5 W" ]$ ~/ Q; R
        m=L_length(b);
& L: U  M7 n/ @9 h+ ]' _% d! ^        n=L_length(a);
" j2 y) D. E) Q& j        for(j=0;j<n;j++)
0 D' p% j0 A* i4 L        c[j]=a[j];
& I2 D3 g7 z( l% C- p8 m        for(i=0;i<m;i++,flag=1)                        //i为b数组的下标,m为数组个数;  j为a数组的下标,n为数组个数;: ?# @% [. f1 t7 R2 K* j6 a
                {for(j=0;j<n;j++)) S8 l' K3 U5 Q
                        if(b[i]==a[j]) flag=0;//flag=0,说明有重复的了! r4 J6 l+ O. i; ^1 x, `8 s
                        if(flag) {  c[n+t]=b[i];t++        ;}5 j0 i6 e" g) x4 h- V+ }
                }
* X  ^2 ]/ ^& f+ N0 [- q  T; g' i        c[n+t]='\0';
+ Z, W( U3 p5 b8 h. u * |9 d! l5 g0 l& v, N; c6 y
}1 r9 P9 h% [- G

. }# U  T/ Y. `, \% l$ `: Uint L_length(char a[])
* r  f4 z# j, a! B" {{
) D# l2 ]- f1 L9 S7 H2 T; H% k( d        int i,t=0;;5 s) e. I9 l7 q/ z* }3 ^
        for(i=0; a[i]!='\0';i++  )6 S6 `3 G4 r! `2 [% z
                        t++;
! i2 ]4 t+ Z/ D, u        return t;- H/ u1 t$ p8 |+ _
} / K- M+ X. z* Z0 D  S
: p. |" ^" d1 k$ S& A* }7 [

作者: 慢跑20    时间: 2014-3-14 09:32
本帖最后由 慢跑20 于 2014-3-19 13:53 编辑 1 _& t3 |$ L. O: k" g6 W  E

+ p2 X6 Y  x/ N* @& s- s. Gli2.1yong用指针:  w$ f0 F. P9 S6 o& n2 ?- m8 V
# \2 C2 _: o+ c: I: L
#include "stdio.h"
$ M+ d- O$ l: V5 K#include "string.h"
9 N* ]3 E8 f1 K2 W5 hvoid Union(char *a,char *b,char *c)7 U2 k! J# [1 y0 z7 L% t' Q
{
* X$ S' R# K2 u/ b. s( achar *p=a;
/ O: a7 \( E  }+ n7 r# I- y4 Schar *q=b;
9 q: W5 F( X( K# K  ichar *r=c;) b' X9 B( ?/ a% U' x' g9 P  v
while(*p) *r++=*p++;) ^3 Q  |7 i- O  U1 ]
p=a;& p$ o7 k. N1 Z0 l( E
for(  ;*q!=0 ; q++,p=a  )
! X' t3 \1 u% `) F{while(*p)8 z) Y; V3 `% g+ \% M1 I8 h
if(*q==*p){q++;p=a;}; k- k, }% P% p3 u4 \
else p++;: U, x6 A+ [$ y4 ~( C& q4 v
*r=*q;
2 F( B0 ^0 t% O, v& X, w* a" ~# y7 N9 Kr++;2 a2 N' r1 t$ }& P
}
6 G1 D4 h/ a# G( ~* x- z3 \4 F*r=0;" p1 R2 g! R; Y3 \
& y0 A0 l; k0 H- m
}4 |( y) L) C* A( ~4 B2 ?

) T- e0 h6 A5 ]7 [( h. fint main(){
9 V/ O! `8 c" Z# H4 B1 h/ {' d, K% Z! v& D" ^$ k* b- y
char a[10];
: {6 j, e. I+ L& p1 i3 t- c+ Pchar b[10];, A8 G$ H4 ~$ Z! p# i0 b: g
char c[20];
' M6 y5 D! ^% k# cgets(a);
$ U) c: d. ?! P: E% `7 cprintf("输入的集合A是\n");
( V# b$ G( E$ e' k0 b- Dputs(a);
( Z6 Q: P5 K) n: w; Z9 W( B* y# N9 A9 F) D+ }' G5 O3 ?$ K0 J* a  f
gets(b);
# m* R% b4 M$ F& Q- G: D% oprintf("输入的集合B是\n");3 f! F% S( e8 A! k
puts(b);8 D" p% |& _+ o3 P4 R2 @

, J8 ]9 g, d9 vUnion(a,b,c);1 }! H, X; u1 W7 Y+ x
printf("last得到集合C是\n");
" r2 I4 g% y) gputs(c);
5 R+ o& I5 s9 v1 T+ s1 dreturn 0;9 g2 I- A! m( g5 [' _
}
+ e( {% n* c! \0 v! q* Q1 z
作者: 慢跑20    时间: 2014-3-14 09:33
第2章最后开始用链表了,由于以前没有接触。这里要重新学习链表:  d% P. |. r6 V" {6 S
#include<stdio.h>
! I. u$ Q4 X7 e: J+ J6 f# C
$ i( y: q! w6 Y3 ^  struct node
+ n3 w3 r% U' H8 T% K/ w9 y{4 z. j, ]9 \6 A( H) ~
        int data;4 x, B/ v9 W4 c
        struct node *next;  z5 P& \. M1 M1 }! J; O
};
; _( G- W- h' u, J; Y( e//typedef struct node NODETYPE;8 ^6 b$ f1 e. g. O4 `- K/ C
void main()5 f% j" Z3 R. X/ G! k" H) ~
{( }1 W& w: `4 @4 G1 E2 a' T
        //NODETYPE# p; U6 ]7 {9 l; D
        node a,b,c,*h,*p;
3 m- c+ u" @0 I- A! n        a.data=10;b.data=20;c.data=30;; L7 a! r; b' |
        h=&a;& P/ `* z' Q- F5 V
        a.next=&b;b.next=&c;c.next='\0';  N2 c. Q, B* N0 D2 }/ c
        p=h;
5 P% P  ?- m3 J" ~; T8 v- w8 K        while(p)/ b% y$ a2 S4 `# l* ?1 P
        {
8 U6 }  R" [: w' ]( c                printf("%d  ",p->data);& D* e2 K9 z$ W6 ?. t. T7 G+ D; L3 e
                p=p->next;
& e: Z9 M: ]3 m        }
  _( U0 X+ N, G6 i  }        printf("\n");& P( s5 J3 U& q2 `; g
}! x6 |# Y% Z4 y

  Q. I5 K- x. m1 p& @3 }这是一个简单的链表。从这里可以了解规则
作者: 慢跑20    时间: 2014-3-14 09:38
此代码为生成一个链表的代码:
9 \) \* e) I& _: w  E% ^' _#include<stdio.h>2 u+ j8 }) W% _% }, f0 {9 s
#include<stdlib.h>+ w' }) p( i4 G  v1 C8 K& Z
struct slist
: V" n. J- k7 k. F$ U; s{
# i* W: F) N' U8 p& `, f) l( m        int data;
( O( T) s/ j- _! w' o" `        struct slist *next;
- S9 [; v5 H9 f' C& i0 b% Z}; * z; b2 A1 E1 \+ K
typedef struct slist SLIST;$ ?1 p- F  [/ y6 f- e9 f1 J
SLIST *creat_slist1()
: d- q6 N5 T% G" p{
/ q: y" x1 \% m" z. `6 \        int c;
/ n7 @; r! h3 T) @$ \& k        SLIST *h,*s,*r;
' |4 K2 s2 ?3 O! o7 }8 z        h=(SLIST *)malloc (sizeof(SLIST) );  //生成头结点/ x7 U7 F0 h+ r( C9 a6 d  f
        r=h;0 c5 m7 K* v7 l0 v; R# T& e3 q& L9 I
        scanf("%d",&c);
+ j, s9 H9 }. H" M9 b; F: @* O        while (c!=-1)                                        //当输入的c为-1时,代表输入结束: E# L7 o5 P) n. q3 k
        {8 z0 r: K3 E) X4 m  c
                s=(SLIST *)malloc(sizeof(SLIST) );  //生成一个新结点
5 h0 Y- z3 K, X) s! R8 [2 \                s->data=c;& k( ^1 M7 F/ v/ H3 r
                r->next=s;& \, Q% g$ U7 O7 p9 S# Y. I
                r=s;) S( U7 D: T" m
                scanf("%d",&c);+ h2 F2 t- o4 A9 k; F# ?0 J$ p+ s6 G
         
' f- [, T  A+ a  c; s' n- R- l, x1 E        }
  X# V2 f6 i+ T) C. s, F9 W        r->next ='\0';( ]. ]( U  J) [2 X
        return h;6 p7 f8 H- P$ s3 G! I( e! M
}
& c7 \# I  ]+ A1 ]+ ~$ f# }8 F3 g: N3 \7 {
/*
1 p  `* A. r' p( f4 Z. m: A4 A7 L7 wprintf_list(&head)2 ~" d# I2 Y/ e- q2 b1 Q' q
{        SLIST *h,*s,*r;7 M( r0 F7 M! x+ w' e
        int c;
. b4 U1 k3 a) Y        h=(SLIST *)malloc (sizeof(SLIST) );
5 H3 Y" I" n9 P. x; A% r( U        r=h;7 ?( D& K3 d2 s+ m+ l
        s->data=c;
9 }$ [9 p- W- {: K% T- }6 C6 |! d        //scanf("%d",&c);5 L1 t% o+ v/ p# F  {4 L
        while (c!=-1)
: R8 Z5 F( f# w- S6 _1 a        {& w9 U% n6 J0 _5 q1 I9 ^, x* J
                printf("%d",c);
7 a2 D6 R2 x8 e                s=(SLIST *)malloc(sizeof(SLIST) );
0 j& ~( t* }7 a% E                s->data=c;  P' T9 o6 V. ?0 y
                r->next=s;
. e2 V- `  O! o% A# J; y                r=s;/ I! v" H2 g5 l5 ?
                * n# `8 m+ {- B& f/ i5 u
         
3 @% ~. t" G8 W/ I        }
8 a4 ~4 m6 S* j8 F        r->next ='\0';
( P" c/ w- E5 }* K        return h;: o) z. `% Z. h4 Q! ^$ y
}
0 Y$ H" \  @9 b*/& ?  p  x4 e0 y  w
void main()
  q4 S- V$ b" X" X, ]7 L& {& o{ SLIST *head;
5 c7 p3 L2 v; {$ H5 c0 A' y6 Z4 x! u( c( @, }
head=creat_slist1();                //调用链表建立函数,得到头结点地址
+ o/ ]! s7 W. Y7 c2 v' Y6 Vprintf_list(head)# H% T+ b2 ^8 K# {% f% y7 m$ Q
}5 u- \) _! ]! |1 ^* k, e$ |- P+ p

作者: 慢跑20    时间: 2014-3-19 13:54
2。4节需要用链表计算多项式的加法,因此,熟悉结构体是非常必要的。0 c1 F7 F* b( l/ M8 ?" V, B: h% A2 J

+ T4 b2 _8 o4 E/ f#include<stdio.h>
1 f+ I3 }9 B9 o1 ~$ i #include<stdlib.h># D9 l/ Z+ b4 M2 @" I8 w
( ~/ s2 q0 w' j  D- ~1 d# y) u; i
struct slist
8 ]1 Q% B% u/ F$ Z8 ?' D9 P- U  {7 B6 i7 G$ y; z( S# E0 m
  int data;
/ U: x# c/ X" _& E- t, Z  struct slist *next;' s4 T3 T  Y/ q6 i: E  \- I
  };
- c! g: [  O2 i# C2 o* i( y' Y! ]  typedef struct slist SLIST;3 Z- L9 n7 }4 Q5 k
# D& K) Z, `0 B
SLIST *creat_slist1()
! R* Z. Q& p' t" b; p, X  {
0 S. D; y; F+ J8 Z1 l3 m1 s  int c;
+ A5 \( E% E5 d0 [8 m  SLIST *h,*s,*r;% c; L7 D0 j8 o' U* S+ k4 ?+ P
  h=(SLIST *)malloc (sizeof(SLIST) ); //生成头结点% B6 [! C% n; w& X" H
r=h;
) M( q6 I, p3 \/ S  scanf("%d",&c);6 p; E+ F* ~- }
  while (c!=-1) //当输入的c为-1时,代表输入结束* f. u( X& l" K! G( Z- b* g( m
{
5 v' D+ O+ q  D% J9 K6 v/ Ps=(SLIST *)malloc(sizeof(SLIST) ); //生成一个新结点
/ M( d' O' s- k# O$ n4 Us->data=c;
; g  j/ \3 G5 {/ p  Z# h2 {! H  r->next=s;7 o$ X9 h& F) ~+ y# }& S8 K
  r=s;
$ T9 j" @3 A! X  scanf("%d",&c);
& h4 Y4 r2 ~, v# O; |! i
' m5 @/ v- L9 N+ g: l2 t. q$ v' O4 |}
' I, l8 S* |! ]9 z/ h  r->next ='\0';
) x. _1 c+ [/ T( O$ ^7 t" H! }$ n  return h;+ \) Y/ T% H+ w  g; B, l. ]! c
  }' I4 _/ v! c9 g+ j( R+ E0 e9 @9 f+ w

7 }, G( E- O4 d# B" d0 I/**/  //想加入一个函数,在刚才输入链表各个数值之后,再输出这些值。如何写呢?$ P3 `6 ^* O! L& y9 P
int printf_list(SLIST *h)
- `. i. k  I% B4 w  {. {  ]2 F: w0 v( {" k4 M: V
  //while (!h->next )//教材上经常使用这个语句作为h->next是否为空指针的判断语句,但在VC++里边,这一句与下边一句效果不同,具体原因还不清楚; B/ y3 l" I# g+ b# o( x( H9 V
while (h->next!=0 )
) r. d+ D9 ~/ w- _' x: H( e; L  {- F# @* d6 p- c3 n+ l3 \1 P
  printf("%d\n",h->next->data );
' ~% m- A% E1 A4 t; G. L  h=h->next ;* b0 A+ E# p. z, R) g* o2 j+ p5 T, z
  }) M, z' ]4 ?' {! `% D  ?6 q  f- H# ^
  return 1;
9 _- X' y. O9 ?  r+ P2 v. ?  }
& A& M" `- `* B3 H  /**/1 U; B. v2 _5 X
void main()
3 Y; Y8 q% H$ m9 G- |8 p5 n  { SLIST *head;: z2 C, O- X5 b( p/ ]; r
9 r$ d, g, Y+ ]$ k, V$ {9 Y/ o
head=creat_slist1(); //调用链表建立函数,得到头结点地址" e- a9 @- e* W/ N
printf_list(head);
* k1 z6 Y( b6 P9 K1 _( j& P4 N  }
2 H' B  s' `. R+ A& T+ e' h/ d" Y0 a+ E3 F2 N9 F7 j2 R: K0 y

* h" A% P  M8 S2 P7 _此函数功能为:输入链表中的数,然后依次输出。




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