数学建模社区-数学中国

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

作者: 慢跑20    时间: 2014-3-10 21:34
标题: 数据结构,清华 严蔚敏,例题代码(自己写的,持续更新中)
本帖最后由 慢跑20 于 2014-3-10 21:38 编辑
4 E: |! @  y, v# c7 p# y: A5 P; R6 I, k  i7 i
计算机基础课数据结构,清华严蔚敏这本书是公认的一本好书。
) T  V5 A8 S# O# z6 _4 P  [; e刚好这学期我们学习数据结构,想把一些例题的代码写一些、既提高了C语言的水平,又可以加深对数据结构的理解,为以后打下良好的基础。. A4 e% \9 Q( K; O& p! D$ x

作者: 慢跑20    时间: 2014-3-10 21:34
本层占楼编辑; D( ~$ E/ w9 w, b+ R- s

作者: 慢跑20    时间: 2014-3-10 21:35
20页,例2.1 A,B两个集合,合并成C集合。
9 O4 Q0 A' z% Z. v这个代码是用数组的、算是比较简单的。# S" p. G  T/ m& p2 {

0 U, y' C8 _  U) F& E1 g8 e4 E5 M#include<stdio.h>
9 H9 u' v; A! Z1 E. _9 L; Zint L_length(char []);9 z9 \- ]/ g  \/ I
int main(){9 }# p) L; ?( C3 w4 W
        void Union(char [],char [],char []);4 K' P+ Z% Y! F* x' E( K

$ W1 Z' C; A: o+ d4 I. K# N        char a[10];
# C( `8 p3 ^, T# x: i0 P9 n3 r        char b[10];
( O5 F; }. C4 }/ I) f: W        char c[20];
0 \* `3 }- r6 Q1 e        gets(a);
: z* S; Y$ [9 x1 I$ b" N        printf("输入的集合A是\n");
0 q' t4 y( k( f        puts(a);
, P  N6 i' ]/ R/ d7 `* A2 @' x
& k0 V# ?7 N, K        gets(b);
1 J3 c# P& a, W' w        printf("输入的集合B是\n");5 X& R" g# L) Y- u. l, K1 C
        puts(b);
) e9 D5 u: Y% x3 y) I: j. T& W5 e* l% u" O
        Union( a, b, c);
$ y  _4 [% i0 y2 U3 N        printf("last得到集合C是\n");; C8 q; u, x& {. ]& L" \# |
        puts(c);
8 S0 e& R. _, ]9 K% ~        return 0;
) h4 U9 U; P. }, m}4 x# t+ s# b; E/ T7 M

- n" E# U1 z  |4 y& Wvoid Union(char a[],char b[],char c[])! k$ M3 f' A7 i  O& |8 a
{# m  i9 a: N! ^0 \
        int flag=1,t=0,i,j,m,n;
7 u# c. S: T; r$ Y  b        m=L_length(b);
) T. E* N- h. k: T        n=L_length(a);$ Q5 H3 y/ k, J# o# @
        for(j=0;j<n;j++)
" B) A6 \- Z5 X3 d' e$ L        c[j]=a[j];) Q+ _& n) a7 Z/ J3 K$ b
        for(i=0;i<m;i++,flag=1)                        //i为b数组的下标,m为数组个数;  j为a数组的下标,n为数组个数;2 Q! e! {4 |2 t5 R' G/ l
                {for(j=0;j<n;j++)- b8 _2 |( w) A6 c2 Y
                        if(b[i]==a[j]) flag=0;//flag=0,说明有重复的了- |7 }9 X" G, ]. B! l( ?
                        if(flag) {  c[n+t]=b[i];t++        ;}7 |9 ^! \  q: C! _; |
                }
  T0 l5 S% Z! G" B        c[n+t]='\0';
8 y! ~0 ?2 N/ V' q  r
* j2 q. P/ x- R$ Z4 Q! n+ n}3 _; y6 _+ W' E: E3 U3 {

) ~3 M, ^- q8 v! u7 gint L_length(char a[]); b3 F  L$ w) `( ~: S; a: _
{3 I$ }* k! k. r1 ^1 q) C; W. F
        int i,t=0;;
! B0 v3 j1 G& a        for(i=0; a[i]!='\0';i++  )
! l" `* w" Z1 D3 i* M                        t++;
, j; T, g& x0 }; u        return t;0 j* y' f, ]# g) u3 e; ^, x
}
$ j) A: B" b" P9 C5 O
$ @9 N, k* ]' ?2 \
作者: 慢跑20    时间: 2014-3-14 09:32
本帖最后由 慢跑20 于 2014-3-19 13:53 编辑 0 k% [% o& P% y) c% i

# i; T4 g6 j% U$ O0 H4 z: vli2.1yong用指针:
* [! X- b: g; P; W2 j* r  J; E
# c# x' O( D9 x, Z0 M4 |% H#include "stdio.h"% a  r) U9 h9 I
#include "string.h"
4 r7 n  v1 k1 j) h. Mvoid Union(char *a,char *b,char *c)
( a  e( _6 k! F# d1 I{2 f' ?# V7 w% z
char *p=a;
$ K" J: G" t; P6 \  h/ a3 \4 R" jchar *q=b;" w" Q3 Q6 S9 C+ I& ~; w
char *r=c;
' O4 M4 Q/ V+ ?2 ~  E! C; kwhile(*p) *r++=*p++;0 K9 D' i; O& y
p=a;
) L8 ?9 x/ A. E0 Z4 w, wfor(  ;*q!=0 ; q++,p=a  )+ e9 ~. ]& A: t0 d" R. x& U
{while(*p)
5 `& _7 ]/ v7 q# e, [* \+ \2 j: _if(*q==*p){q++;p=a;}. S- H# K; e+ ?, B4 s) i) j
else p++;
+ `! l: N( Z* R" N4 l; I*r=*q;* j  a0 S3 m& |+ @# Y* y
r++;
, b: ?7 J. C/ k' ]4 L" v  N}( {- ^2 B1 ]1 [, W
*r=0;  B" w" W5 q4 o9 Q" J

* R1 g: h) x2 H2 }}8 G9 H" N% Q$ b; d9 i

; v. Y* [" k8 F: K, R6 \8 jint main(){' V/ |9 r; U' B! S- j% o, u  v, `( g

* b- P. r6 I; z: \char a[10];0 ?+ R/ B6 ]# j% s" b5 ]$ z
char b[10];5 ^1 \' X$ m! N
char c[20];
. j1 o- W  M5 o0 o9 z* D" Fgets(a);+ q3 `0 v7 R" C7 P0 x6 @: H
printf("输入的集合A是\n");# R; r: q: i+ Q" j. m8 W) r
puts(a);8 ], b. z4 w! `7 R1 G
6 O& O) j: S  X5 B0 J& T
gets(b);& ~# X$ t  M  F- V: R  L. y, j/ C' `' C
printf("输入的集合B是\n");% T6 V, M, y' G1 W
puts(b);- q& B2 @  U, s3 n) _

) r! ~2 r% W: [0 o. ?  PUnion(a,b,c);7 Q- s& ^  D7 t5 y
printf("last得到集合C是\n");
/ S$ k6 O, o3 X$ @$ B+ S, T9 k, H4 Eputs(c);
: S" F$ y, U% W$ kreturn 0;5 m6 {+ h6 K9 m  t0 B
}
& \8 P# U+ ^# i# q) ]  S
作者: 慢跑20    时间: 2014-3-14 09:33
第2章最后开始用链表了,由于以前没有接触。这里要重新学习链表:
& f; r; @1 x6 \0 J/ w0 g#include<stdio.h>5 H0 s; `4 r# f. Z7 H, s

  m: Y' {: u5 e; u! a) n' q" ]. e  struct node
1 \4 ~, V' w) Y# H{
- \! g! {! i# }3 Z9 ]/ P        int data;! X% i) b  \$ t. ~# W: ?9 C* y9 D: y
        struct node *next;
, p1 s+ Y4 h! }3 p* Y0 ?* z};# N/ a6 P' A) n3 R# B; |
//typedef struct node NODETYPE;/ c! \% B( x; P2 q
void main()
  l( h4 [* u' s% ]& S{
& x/ `& k# n7 A% n7 E        //NODETYPE
+ N( H1 }; ?% V3 ^. u' _/ k        node a,b,c,*h,*p;; o  `: \% y, b, G: Q3 e# J" H
        a.data=10;b.data=20;c.data=30;
& O/ v" _( {; e7 I+ N. E        h=&a;% l, ]$ V$ r; L9 o! e
        a.next=&b;b.next=&c;c.next='\0';
* w. d+ n+ Y+ X5 Y5 M, z4 h        p=h;
0 s, n( G& V0 j        while(p)
$ _( P  B" w/ \5 j( V9 g% x. I$ d        {$ b( R" A8 g0 _, K- D) ^
                printf("%d  ",p->data);5 r% K2 u4 d& T+ f2 F+ P8 {
                p=p->next;
7 t, r& c3 `0 E8 N8 L        }
% \" [; B8 ]/ L, y3 q- v$ u        printf("\n");( w/ o) L5 j! X4 {
}' `7 K9 {  a# K+ P8 F( U

6 z' m8 m3 I2 Z$ G" t. C0 W" ?* ?这是一个简单的链表。从这里可以了解规则
作者: 慢跑20    时间: 2014-3-14 09:38
此代码为生成一个链表的代码:4 y4 [! S4 Q8 X) C
#include<stdio.h>+ j8 r7 E% y5 v
#include<stdlib.h>
' A  D+ z/ i* E& Estruct slist
" `# c3 e- ]; u% j. ^{
1 [2 {+ p2 X5 `2 F* i4 C        int data;1 M7 r2 T8 p6 ~% \: q
        struct slist *next;
% i: U9 n) m1 @" {' t) e+ I};
; W3 e9 m* o. ~. I" E; ^) ptypedef struct slist SLIST;8 v( l+ x4 M8 d. I# z% {
SLIST *creat_slist1()8 h) i; i" O; J. l+ W
{* \. O7 X9 m8 Z# b/ x9 U
        int c;
. L/ B" e1 b1 f2 q        SLIST *h,*s,*r;4 f2 a! p3 r* f( ^* N
        h=(SLIST *)malloc (sizeof(SLIST) );  //生成头结点2 N6 _( n5 i2 O: i/ Y# {. ]
        r=h;
' D* N# A! Q- m  a2 O' n8 w: p  V( J        scanf("%d",&c);7 o' X  h4 I, S
        while (c!=-1)                                        //当输入的c为-1时,代表输入结束0 K0 r0 U2 z' {6 {2 x6 [% b
        {
7 W5 x8 h: Z% c                s=(SLIST *)malloc(sizeof(SLIST) );  //生成一个新结点; [. }0 P' f* d& H' m& M, B2 k
                s->data=c;: m" m4 g5 a( h6 A2 e% z2 j  E5 m
                r->next=s;
4 m3 b: t. T: W9 v9 o; s# G2 Y                r=s;6 |# x' {$ A. k$ x& _
                scanf("%d",&c);
/ m& B; n7 }1 c2 l# h         
6 P8 J5 D' q+ \0 ?" p6 e        }' p1 i3 z' B( o( d, e
        r->next ='\0';
% u. p' J' _0 B( I+ ^/ Q7 B        return h;2 x( M+ u1 p; }: N* |
}8 p* C) W$ p- G- q5 I8 M$ {

  W1 ]% d) X- @( f6 N7 G. O' V- J/*, v, n, g1 U' e' N! d& M, G
printf_list(&head)
6 A, }. X  h1 f( R7 K/ a/ ~{        SLIST *h,*s,*r;
+ J/ I/ t/ d4 A" e% s        int c;( ~7 p* W8 p3 }5 a  T% e( K! u
        h=(SLIST *)malloc (sizeof(SLIST) );
) G8 i# w+ c4 |; _) Z        r=h;$ E% g! D' M( v6 t5 J
        s->data=c;' i0 d3 o( h* x. g( S8 K# F3 D
        //scanf("%d",&c);! t1 `6 D- C4 Q% S. ~5 H
        while (c!=-1)$ E6 x* F, ?0 b/ y6 X. ^7 n
        {) w' u( C- t* @7 i# [: S: h8 G' D
                printf("%d",c);; ]& E& V6 Y5 j; d* E: |1 s* f
                s=(SLIST *)malloc(sizeof(SLIST) );: {* h5 E0 P* W  \% r0 q
                s->data=c;+ G& L$ g- W$ }! X
                r->next=s;
8 {% b0 q% |. N' ^0 t! H                r=s;+ ?! a2 ^% N4 t# X; U
               
/ `' M( ?5 L) S) |- Q         
, {. `$ ]2 J, H; R& F9 B        }* r1 ^& Q5 e& C4 h6 o
        r->next ='\0';
# ?5 b# C8 \+ L  H5 B" X8 I        return h;
+ r9 y. u: t$ g0 ?$ K}
# X1 Z9 d7 B! z9 y  Z*/
5 P+ ?; ?4 ~" `7 kvoid main()5 i/ j$ \  Q' `% M3 r+ b
{ SLIST *head;3 v- Q0 c- S2 Z7 }; g( M

9 u: Y6 Y' T/ Ghead=creat_slist1();                //调用链表建立函数,得到头结点地址/ v, G. a7 C' i2 X
printf_list(head)
2 S4 N' }" B/ k}
7 d3 M9 V0 D7 T0 y! Y' W
作者: 慢跑20    时间: 2014-3-19 13:54
2。4节需要用链表计算多项式的加法,因此,熟悉结构体是非常必要的。" x8 A4 M8 x6 j( v8 u
7 c/ O' N* e* X5 n: p" A* ~
#include<stdio.h>8 _+ A3 h" D8 m( M7 I+ L% F
#include<stdlib.h>
1 @  I  G* r4 I1 L4 v& s: e . n  ^; E- ]" m6 v% m  i
struct slist; d- C* `7 s; i) p( g1 a
  {
! x/ }  u- @& {  int data;
' z: \8 r- `  g" V: j. f$ A1 e7 c  struct slist *next;
- j6 w0 V: ~4 e  };
5 j3 D+ `7 x* Q+ n9 o& u: n  typedef struct slist SLIST;* N' j( P9 P5 S- x: `# F
5 b1 I, U% X/ e) L" T# R0 y- h" B. K
SLIST *creat_slist1()
. F4 o4 g$ Q2 e  Z3 c3 K8 m" w7 H  {
& O  N+ G0 B, c8 d: C  ~* G  int c;. V1 h* J7 s) f3 u8 D6 g. i: b7 v
  SLIST *h,*s,*r;
$ ?' Z3 W+ }# ?& W" ~3 _  h=(SLIST *)malloc (sizeof(SLIST) ); //生成头结点! j# f' ~, D  r, L/ b
r=h;+ W# a6 D* D/ }+ b7 K6 K5 h
  scanf("%d",&c);
/ k# e0 t6 a$ w8 P! Q  while (c!=-1) //当输入的c为-1时,代表输入结束
5 M8 J9 s1 K, z/ q  q! L0 F  q8 S{- h! d7 d; J+ H6 n6 Y/ A
s=(SLIST *)malloc(sizeof(SLIST) ); //生成一个新结点4 L1 D* b+ I; C
s->data=c;
3 O! V; u- q( g  r->next=s;
3 J3 a5 V/ A2 ]% X; x  Z8 ?  r=s;
% B# T, v$ z) s) \* A  @9 ^  scanf("%d",&c);
' v$ f: J0 Z/ z# ] . G9 ]# M6 J: |9 z5 b8 J) s0 k
}* y* C3 H8 f' _  G) s
  r->next ='\0';! D: P$ \4 R; A
  return h;% B% M: m6 ^$ A: ~
  }. U. K( z7 j- R* y& R1 ~

  o: m; ?3 Y# {6 m: T: Y8 l2 X3 N/**/  //想加入一个函数,在刚才输入链表各个数值之后,再输出这些值。如何写呢?
( ]; C: i/ P8 r% eint printf_list(SLIST *h)9 L! Z4 e, L( a$ X* `
  {
0 G8 E8 F  B$ x8 e0 l' }9 E3 V( v' v% k  //while (!h->next )//教材上经常使用这个语句作为h->next是否为空指针的判断语句,但在VC++里边,这一句与下边一句效果不同,具体原因还不清楚+ f1 C9 \: i' \4 j1 c6 w
while (h->next!=0 )) I) Q5 g, @0 c  k
  {
' v( L/ J8 K* _# I  printf("%d\n",h->next->data );# r' u* A0 L) M' @
  h=h->next ;  h. d8 [7 {) P" J5 d
  }
! x, w' \$ ?7 n8 I: ^  return 1;+ d7 c6 ?5 ?0 Q& P& t
  }
9 b. z1 s4 ^2 D% u  /**/
4 J) H; Y1 k: a% ~* X: [* A2 G4 M void main()
& k$ y) o; d# y  _7 S* D- s  { SLIST *head;5 z) a3 Z) V8 H+ p5 j

8 f  g5 }2 e1 a3 D5 P9 Ghead=creat_slist1(); //调用链表建立函数,得到头结点地址
4 b( v- q0 f& J( Bprintf_list(head);
6 K* ^' P  T! Y9 {" o' B+ K  }- u: a  R. w4 E( y1 N

0 [4 Y; A1 C% U
" v7 w9 t4 ]; w* ^1 b此函数功能为:输入链表中的数,然后依次输出。




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