数学建模社区-数学中国

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

作者: 慢跑20    时间: 2014-3-10 21:34
标题: 数据结构,清华 严蔚敏,例题代码(自己写的,持续更新中)
本帖最后由 慢跑20 于 2014-3-10 21:38 编辑 2 c; @5 {8 C: n/ s% G; Y7 G

7 K+ e3 _4 V! A  z$ ?- g0 P+ G计算机基础课数据结构,清华严蔚敏这本书是公认的一本好书。- I+ g8 {* [' [, i
刚好这学期我们学习数据结构,想把一些例题的代码写一些、既提高了C语言的水平,又可以加深对数据结构的理解,为以后打下良好的基础。" k5 p( O  v0 I+ g3 \6 @3 [( S

作者: 慢跑20    时间: 2014-3-10 21:34
本层占楼编辑
8 n! ~0 Y; e" @/ b% `6 F; f/ k* _" H5 w
作者: 慢跑20    时间: 2014-3-10 21:35
20页,例2.1 A,B两个集合,合并成C集合。' ^5 N; U6 L! [
这个代码是用数组的、算是比较简单的。! n5 d9 z- o  a6 w! p

5 f* v6 l! h5 H5 q  n' S2 i; i#include<stdio.h>
+ w7 I2 `( R; J, H7 @$ Eint L_length(char []);
0 a) ~) k( w2 m8 mint main(){
, `2 I  p# B9 r; z! i  C6 K" M( k: {        void Union(char [],char [],char []);
7 U' `/ M/ h  s- a
6 c& R3 z5 X, M        char a[10];
  a6 ^4 a8 A! Q1 R; }        char b[10];
4 H1 m/ `6 A$ N. W  s& `        char c[20];( g) \# V# Y3 b' P% S8 s
        gets(a);
1 a1 ^- l3 z  u) T# C2 A" K& j7 {        printf("输入的集合A是\n");
8 A$ e/ y' f3 [% H        puts(a);% k- M& }: b2 n; ?
. I5 ]  f8 X' S2 D, k, y
        gets(b);
8 ?) F" N8 U4 D) e        printf("输入的集合B是\n");8 ?1 ^0 z4 d  Z) l1 {3 {9 E5 e
        puts(b);
# Z6 F3 `. ~: S! I
/ _. ?, v$ n7 H0 ~' G        Union( a, b, c);
: H. w% Q' v3 `0 U        printf("last得到集合C是\n");
1 v2 {$ N6 f% J; e9 J2 t$ L        puts(c);  y; q0 b# e2 P/ f7 s: z6 s: {- B* p
        return 0;( e' p! b, Y: `2 s5 o% R: ]( _
}
$ r" z% O1 J! y$ Y+ G7 i: Q2 R5 ~3 M% j2 T
void Union(char a[],char b[],char c[])
3 W: v4 h9 M8 t. K{  \, }! w' t# B) Q
        int flag=1,t=0,i,j,m,n;9 C% r8 L. I( z
        m=L_length(b);
9 ~) U5 Q" X( x2 L        n=L_length(a);; V8 |- ^) [7 X% G1 z2 [% ?
        for(j=0;j<n;j++)! V2 d# D1 K* Q# F/ }1 Z
        c[j]=a[j];
+ L8 W2 \& }- h7 P        for(i=0;i<m;i++,flag=1)                        //i为b数组的下标,m为数组个数;  j为a数组的下标,n为数组个数;+ b9 l: T% [$ J% j7 O
                {for(j=0;j<n;j++)' p4 Z5 @6 u7 h0 x3 W( s0 u
                        if(b[i]==a[j]) flag=0;//flag=0,说明有重复的了" K( R' Q8 `( s" X4 j
                        if(flag) {  c[n+t]=b[i];t++        ;}
' [5 d; F3 \3 D, ]  v' ~                }1 j* ?) l9 F. D3 H
        c[n+t]='\0';' D" ^& d# w% a+ Q3 b; ~( R7 |* e
7 L  w6 U& H' Z* N9 m4 Y- M% ?
}! U( D% O( x0 x: i* ?

& E" H/ R- @5 o$ l; k: Qint L_length(char a[])
  Z% c: I! d2 {, x/ T0 ]" o{
9 P1 ?5 \9 N8 [* B5 |$ q/ y        int i,t=0;;3 s" {  Q* v  F: m6 a# p: P! ?
        for(i=0; a[i]!='\0';i++  )
+ u3 s" S2 r7 ^( j- E2 ?                        t++;
1 G: [, v* ?, j        return t;
; t+ g2 F0 K  W0 Z6 U  c# S} ( H4 c8 l0 Q8 O6 |) t
% |5 i8 }$ Z: F) ~

作者: 慢跑20    时间: 2014-3-14 09:32
本帖最后由 慢跑20 于 2014-3-19 13:53 编辑
8 t8 l' A+ z1 E4 z
: e$ J" v# C5 q8 S9 N  D/ q& Ali2.1yong用指针:
, ^# f1 i' @) |: n2 I1 D) k' b* h; v* `* B8 X
#include "stdio.h"
0 Q& D" b- ~( E( h#include "string.h"
3 T1 z- L; }- P+ a1 nvoid Union(char *a,char *b,char *c)
8 G7 y' }  H! @- R: F6 @# Q{5 w4 W1 v% T) G# `' F
char *p=a;- [8 p- n! z* W4 H, w2 B
char *q=b;) X& u) n0 N5 N
char *r=c;
. n% |0 W( W: ~+ g* a" x. H& y; pwhile(*p) *r++=*p++;  W4 r( |, F: D
p=a;- N- ?$ o) w  H6 I6 ]- \
for(  ;*q!=0 ; q++,p=a  )
# J: U6 m! X  N2 p9 r1 k, C{while(*p)5 g# X. ?9 N  w5 M3 \  I
if(*q==*p){q++;p=a;}
" o, W& l+ C% v% H7 x0 g0 ?+ N: Y& delse p++;# `4 u' B3 l* ?- z( Q/ I8 W# s, }5 v
*r=*q;
2 G/ B. `; Z2 \, Zr++;
6 l- |2 w; Y3 n* H! T' H( [}# B7 K7 {0 `; X
*r=0;
1 F' I& W4 R! F. B9 n" H$ R( g9 Z' i/ X4 B$ j3 j
}, p/ q3 p% {. f

$ A$ r. y" }6 J* ]int main(){
% g! Y( j' `* h5 i$ m- [$ e% G& i& C: @1 v1 }# o6 u# E! l/ O3 W
char a[10];
3 a! L! v  z5 Y8 e5 v2 Hchar b[10];5 a, x  L  x/ h8 i' `$ `& A
char c[20];3 x! c1 o; n9 N: Y* h
gets(a);4 Y( u0 ?5 `6 B% e
printf("输入的集合A是\n");
5 c; _- }- K/ e$ aputs(a);
& A- r7 o6 t4 D8 x% q0 T8 J% Y) V+ f1 _8 @  I
gets(b);4 {5 X; m" D; O# f
printf("输入的集合B是\n");4 J. G: [  C# x) g$ y
puts(b);* y; b' B7 w7 e

9 W$ i5 N7 Z5 h. a, l( vUnion(a,b,c);
% @! U7 M$ O9 |6 N( Aprintf("last得到集合C是\n");
" x  t1 Z3 G9 B0 kputs(c);
4 q  Y" z1 y5 q& l) i3 p5 Lreturn 0;
, ~# t5 x( y" p* @}
% j! U$ M0 |1 v7 z* X& m$ a
作者: 慢跑20    时间: 2014-3-14 09:33
第2章最后开始用链表了,由于以前没有接触。这里要重新学习链表:4 D. T- `! S" a% Q% ^
#include<stdio.h>% v' ~  M" p; l/ @5 K8 C

3 b% _. f- g. e# d- ?! {$ u  struct node
2 t6 r8 F5 P  V4 X, ]) R- V{
4 C1 H7 C7 [" p2 @( t1 s* Y0 G        int data;1 v& ]+ p8 f3 c3 Q7 q) B1 `5 ^' ]
        struct node *next;
' Q7 w' K  r3 y! B5 \};3 t1 D* ]6 P4 {, r' N  Q5 C
//typedef struct node NODETYPE;% G* f7 d* M: H
void main()6 z- x/ Z2 U% w8 U" J5 G* Q8 X5 H
{) K& L/ i. u) A' d. Y! l
        //NODETYPE3 M5 W4 j$ h# B4 j9 Q5 [! y
        node a,b,c,*h,*p;
" C0 b: g* d- K; ~0 x! R3 V4 W        a.data=10;b.data=20;c.data=30;
- c) P( ^' ~4 S8 u% T$ `8 J        h=&a;/ J* _9 L7 ^4 O4 v
        a.next=&b;b.next=&c;c.next='\0';
" [: p* S1 h% N        p=h;" u* v/ c5 W. N. x
        while(p)
  j; B- z% e' G/ e0 A8 @' l        {- C9 m3 V1 ?# Q" K# L
                printf("%d  ",p->data);
" s/ x6 O- t/ u                p=p->next;
( C) r% r2 T% {! O/ ^        }
* w: z, N, Y; t9 U        printf("\n");. K+ Z" Q' Z8 |% M
}
; z1 p1 V' M6 k2 s. ?( F* ?; ]4 \
' ~4 B3 p/ n; z' x4 k" {这是一个简单的链表。从这里可以了解规则
作者: 慢跑20    时间: 2014-3-14 09:38
此代码为生成一个链表的代码:" @$ V) X3 Y& J4 T
#include<stdio.h>
2 z# R, F7 Z( u5 C, _" u, m#include<stdlib.h>
/ P: {& |3 r7 f, L: Nstruct slist
3 y# l; K3 n2 w. Z( E6 ]( d0 ^* U{
3 ]( _8 ~5 w( v- f: O        int data;
, `9 q, z, A3 C        struct slist *next;  n2 E7 F. b, O; E
};
) ?) r3 h$ r3 N7 stypedef struct slist SLIST;
6 j" e" P& n* v6 e1 A3 M7 KSLIST *creat_slist1()( e6 s9 a" L  m# u. S
{
: U  E2 [1 Y3 l        int c;! j1 O4 o0 {8 |- w- s
        SLIST *h,*s,*r;
( t; @3 l, q7 W. R( O# J# g        h=(SLIST *)malloc (sizeof(SLIST) );  //生成头结点
. _" n) P3 w7 W4 i  z        r=h;
8 K" T+ l( H" a2 n  I% @1 I        scanf("%d",&c);6 F% I3 G, Y. O' ~
        while (c!=-1)                                        //当输入的c为-1时,代表输入结束: T6 g3 \) H/ m" S* i
        {0 o/ }9 I/ p! J8 [
                s=(SLIST *)malloc(sizeof(SLIST) );  //生成一个新结点
6 l2 P% a& S$ H7 {& @                s->data=c;8 o, Q5 B- L- o
                r->next=s;
5 a  w4 z3 p  b) g                r=s;
& Z& d. J  z: Q5 t3 f  M                scanf("%d",&c);7 }) A$ F( Z, m3 H
         5 i( z$ [/ _9 d3 n4 y9 k9 |
        }
! K( p* Y' j1 v4 W4 Q        r->next ='\0';( ]2 a' C0 ]% d$ C% ~( a+ f
        return h;
$ ?- L7 y8 }5 s4 r: u}
; S& G* C5 F* ?% C0 h# J2 e+ A( P
& ^5 T4 x1 s1 v7 x/*
5 |; J. }8 q: h/ W' Hprintf_list(&head)/ Y6 q" v0 C! x
{        SLIST *h,*s,*r;/ Y0 B1 Y8 O3 w" a3 A9 R
        int c;# @) W" l  f/ g. L7 ?  v: b( h- j
        h=(SLIST *)malloc (sizeof(SLIST) );
9 ?. j8 _# k( A" E        r=h;6 ?' {( m0 L  r9 I
        s->data=c;
' x. Q9 v2 H0 |' R0 }6 Y        //scanf("%d",&c);
" _1 x7 p7 h& A2 F' k' L! }: {! F# R* e        while (c!=-1)
$ h$ D  b) f4 c) H4 |        {& l, [7 p. a- {# U6 c
                printf("%d",c);
7 ^6 p1 `6 \! Z; k: M; d                s=(SLIST *)malloc(sizeof(SLIST) );
. O4 X, m$ A& N/ a4 N                s->data=c;
/ n7 o" w9 O' t1 ], o! P                r->next=s;  E9 o9 l- v) I  `( L; E! R
                r=s;# V9 w6 |: N; g* c: C  q
               
# v4 G9 Y+ L: ]- Q         
" Y4 u% v; H' n" v9 c        }
8 A% E6 ~9 e$ `! o0 v2 M        r->next ='\0';' }, H9 [# z: e# g, R+ q
        return h;
6 B2 p; |+ \! q3 g) u! t}- x* X% t+ v  w
*/7 x1 `, L! ?/ ^' t, T. i9 K9 C2 e( H9 V
void main()
+ B/ K0 E3 C9 A  S, N3 |{ SLIST *head;
) v6 X) f# T( n! A
, @& {6 J6 ~' `head=creat_slist1();                //调用链表建立函数,得到头结点地址
$ n1 T0 ?0 X: M) G, d  h" Xprintf_list(head)+ j5 v0 N* N& v; Y
}
# m) \( h8 `( s0 Z5 f3 P1 s- K2 ?) ]
作者: 慢跑20    时间: 2014-3-19 13:54
2。4节需要用链表计算多项式的加法,因此,熟悉结构体是非常必要的。
3 V8 e/ Y/ M( V, P% p0 ^+ ]1 ~1 s
7 A( p4 U6 D/ L# `/ }" W#include<stdio.h>/ H& f2 D4 u! ~; }" h& |
#include<stdlib.h>
# P$ ?; X( t1 k7 b' c1 l8 ]
; P9 J7 }$ [' Q1 s7 n. W+ W struct slist4 E# {8 p+ A4 y+ f9 c" B( l: Z
  {7 R. X" B$ v! n* T5 v: B
  int data;; l* P8 m( m$ g/ x
  struct slist *next;7 W2 x* j( l! d
  };  ]0 [- }% c! Y+ b) O1 Q! B0 g
  typedef struct slist SLIST;6 Z$ I5 t2 b6 i' {7 v2 H) B" @
" {' w: T% v" r/ f, ^( D; q" l+ X
SLIST *creat_slist1()
" e1 y6 O  a5 w% r$ @  D  {
# m- p1 \9 v/ C/ F* y: ^  int c;
7 F# H; q& G' X6 I* R: k. I; R  SLIST *h,*s,*r;0 P1 V4 [/ K0 c: E0 H% I! G2 C9 u" s
  h=(SLIST *)malloc (sizeof(SLIST) ); //生成头结点( ^5 W  D. g# C/ o. E/ T  F& X
r=h;
. ]  F" N9 y0 k: K) c9 _0 ]6 W: C  scanf("%d",&c);
( q: L! r! `% c  while (c!=-1) //当输入的c为-1时,代表输入结束1 c( Z5 u( r* n: V3 x0 R
{% f* o2 k% }% Y, t- n  x
s=(SLIST *)malloc(sizeof(SLIST) ); //生成一个新结点
- m# `" e; _2 S8 x1 Q+ es->data=c;* w+ I0 m9 y" O+ X9 F. X
  r->next=s;! I( S5 R$ H/ c9 C" k) ^# m
  r=s;) V4 K0 q+ P- U# Q
  scanf("%d",&c);
- r1 Y6 J$ b% r) {& l: _0 o& W9 g6 }" X 8 c* a+ @% K/ t  |3 m
}
2 J& V% t5 s- g: M% m% A) C: D  r->next ='\0';
& T" h% ~' ~) V/ K4 l* F  return h;! y6 k  W: A) Y4 ?- u2 Q2 F# g5 u
  }
1 H1 g- P1 T2 v# t- s5 [
4 }) c3 N6 i* L: x/**/  //想加入一个函数,在刚才输入链表各个数值之后,再输出这些值。如何写呢?
/ O' ~3 a( {; v2 A+ i9 tint printf_list(SLIST *h). H6 H- d; V! C$ A2 f: g) I
  {" w! z$ z# t. S6 ]. I- ]
  //while (!h->next )//教材上经常使用这个语句作为h->next是否为空指针的判断语句,但在VC++里边,这一句与下边一句效果不同,具体原因还不清楚
7 O: O( V$ O+ L, W) R! P( t while (h->next!=0 )
: U, P0 H2 A8 ]1 M8 a  {. l% P) @8 e* i2 R* U- j- R
  printf("%d\n",h->next->data );; A( S) h, I- C% E* `6 o. ]
  h=h->next ;
4 {5 E$ E2 {6 W. I, Y. C& H. t2 d  }* v9 w1 ?9 \! J* b) ~6 k2 F8 s
  return 1;+ Y  [  d8 |: e+ P( ]- x
  }
5 m  W% I3 k" m8 L) P  /**/
. F* C) z# R6 H0 G5 F" _2 [7 Y2 O7 D9 F void main()
2 m" c# L' s! ^* `+ ]  m# T  { SLIST *head;
& L! R* T: v+ ]7 w8 w8 d 0 s; \0 n# w! L1 k9 a% A' E
head=creat_slist1(); //调用链表建立函数,得到头结点地址
  @! r1 U: s, j1 P$ P/ U3 xprintf_list(head);
2 y5 l2 z( d; h$ W2 ]- C6 I  }, e6 l, o% H3 L8 ~- c" ^" |

% Q  V  Y. ^7 N
# p. t9 p( T* X4 k7 t此函数功能为:输入链表中的数,然后依次输出。




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