数学建模社区-数学中国

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

作者: 慢跑20    时间: 2014-3-10 21:34
标题: 数据结构,清华 严蔚敏,例题代码(自己写的,持续更新中)
本帖最后由 慢跑20 于 2014-3-10 21:38 编辑
# o2 c, S+ u5 P4 j& C7 Z
- _) C" w' H- r6 T. k9 R计算机基础课数据结构,清华严蔚敏这本书是公认的一本好书。) P: @; ^, u# t- c
刚好这学期我们学习数据结构,想把一些例题的代码写一些、既提高了C语言的水平,又可以加深对数据结构的理解,为以后打下良好的基础。
1 \7 d% H1 k1 B( S3 C+ l. i
作者: 慢跑20    时间: 2014-3-10 21:34
本层占楼编辑% ?9 r% e( Q9 g. G' ^

作者: 慢跑20    时间: 2014-3-10 21:35
20页,例2.1 A,B两个集合,合并成C集合。' o. ]+ U" P! V+ K
这个代码是用数组的、算是比较简单的。
, W  o2 Q' C0 ?' ~2 H
/ T9 F* @) [+ e- ?3 k#include<stdio.h>2 S% R* t6 v* v1 n5 w2 s
int L_length(char []);
" i, i* W, U# x. Z2 T  j$ `int main(){7 p& }6 O! r! }% X
        void Union(char [],char [],char []);% O. Q, c  {' t; Q3 u/ P! n5 S  I
' ?) F  ]! G) F: j+ G7 l# J! j# O
        char a[10];
- ?# S. t1 V  I3 l" O/ u6 T% K6 S        char b[10];8 ]2 _4 o" S! Z4 Y& l
        char c[20];
6 _. n% x) q! g0 E/ `! E        gets(a);; f# U2 P7 h. n6 E% l
        printf("输入的集合A是\n");, E7 E0 y, Q# f
        puts(a);
7 T7 n/ [* T7 A% ~& g+ z 9 T# F2 }" I5 e6 O% |3 Y5 l- ~
        gets(b);
/ r& O6 J7 [" }        printf("输入的集合B是\n");
8 o  L8 t3 u& E8 I8 N: n1 t% \        puts(b);  P4 [6 e. h3 X, I
* I0 G: G1 K* U
        Union( a, b, c);6 B% d4 O2 [" f. T' [% p
        printf("last得到集合C是\n");
8 B3 W/ f7 C; B5 O! u. Z        puts(c);
5 m2 E( F& ?% F( y& e        return 0;; U# i! z* ~, j/ e
}
( `1 V, e1 x# q* T4 @, |
+ E+ I, a9 Y  O  }5 R2 e+ Rvoid Union(char a[],char b[],char c[])& [( }8 k2 S1 s7 m" a
{9 e! {8 z* V( m5 |
        int flag=1,t=0,i,j,m,n;' e) y) `) {1 J0 ]0 L
        m=L_length(b);; I/ M4 \. }1 {* q, G* f  j
        n=L_length(a);
( I* j% Y, {+ `3 G        for(j=0;j<n;j++)# E  ~  ?# {; l2 o1 \8 }+ [8 Y9 W3 ~
        c[j]=a[j];
, t9 {& v7 ], j$ v, _# v        for(i=0;i<m;i++,flag=1)                        //i为b数组的下标,m为数组个数;  j为a数组的下标,n为数组个数;
0 e. {2 C' c! `* t1 V# M                {for(j=0;j<n;j++)! W6 D# V! K2 X* ?4 x
                        if(b[i]==a[j]) flag=0;//flag=0,说明有重复的了1 q% S  H- x* B% `8 j
                        if(flag) {  c[n+t]=b[i];t++        ;}
1 X$ Y8 M* w- o& D$ I" B                }
& k/ [" l5 G4 j. ?( Z6 r        c[n+t]='\0';
: ^2 y' b6 O9 z( s
8 T7 {4 v& l$ U, Q- j  ^: x}
5 ]0 Q  X1 {/ D3 Q0 R' a# N
# N& v: X, @8 p! bint L_length(char a[])/ a& f) ^7 \/ q# F. c( W+ E$ q* o" {
{# X2 G3 {! N  n8 f; S
        int i,t=0;;: M* R* m$ [. |
        for(i=0; a[i]!='\0';i++  )0 d. ?( {! s( O; ^# U& m/ y4 g
                        t++;  L, J  ^* i9 @# x  r
        return t;
7 r% n+ D+ L) n* `' p}
0 S, m6 j9 H6 L! a+ x/ M& t9 T  n( E( F% M: F5 Q- Q

作者: 慢跑20    时间: 2014-3-14 09:32
本帖最后由 慢跑20 于 2014-3-19 13:53 编辑
' u# n* O1 R7 |# @$ A
. C. O  F5 p( E: Cli2.1yong用指针:: ]& D) Q- I% i6 c

& ^% q5 P8 v( a6 J" Y0 K  {#include "stdio.h"
- O  g2 ~7 c$ G! z8 ^' V#include "string.h"4 T1 i3 C9 f* l1 z
void Union(char *a,char *b,char *c)
0 w+ D8 y$ T+ p/ h{. Y+ V: m; `6 l- m+ W0 |5 a) ~
char *p=a;
! y: X) r; |5 P/ Tchar *q=b;
0 m, S" z9 Q5 u+ D8 dchar *r=c;; j7 x, l3 }7 r3 p$ f
while(*p) *r++=*p++;; R# }' l$ C  s3 J* E' J
p=a;' L6 S$ v  s% Z5 v
for(  ;*q!=0 ; q++,p=a  )
/ u! ?3 R% L$ S# ?% S) g* g{while(*p)
- {" F$ l0 t1 [5 h/ ]) dif(*q==*p){q++;p=a;}0 Y; C# A" U1 D) E: R# T
else p++;9 J) ^% c' g3 y6 H" Z% e5 }8 D
*r=*q;% t" n0 e# q  M) m/ \
r++;
' H0 ]7 ~7 V1 P6 \8 |8 X+ t}
9 s! i3 T: [1 O% O1 E$ |*r=0;
( r; N% |! \. p
  Z) c) h% P- ?7 D% c; o& d3 f( U. g}
( R9 ]: }0 Y$ W# p6 z+ a/ R, a. T( m( s; s$ v
int main(){+ E3 l! p0 W; c% L
* p4 c6 B# g, S* C+ l& M6 T
char a[10];
5 A( K* U* f( s4 Nchar b[10];' l5 e2 m- d5 v$ F! c, E
char c[20];
/ }- q0 @) s) b% e' H% ~gets(a);/ W7 f' B0 j. s* [
printf("输入的集合A是\n");
$ i6 h# O: d7 |+ O/ B5 v2 fputs(a);) p( w/ K6 X: ^! q' w

5 c, y$ i* {  q8 kgets(b);( {1 G7 U% U5 K: Q* J- n
printf("输入的集合B是\n");
  B  J: U% J7 k3 e/ Dputs(b);
( k' @- G, ?, L; J, g, M: M. P. K1 l" y/ f1 C  j/ i
Union(a,b,c);, N: t/ L% u& X2 I
printf("last得到集合C是\n");
4 k+ H1 R2 q; j/ _. p; eputs(c);
* G. v* z$ n8 U0 d# Preturn 0;2 C8 k: b' y  D5 _4 a* I' n. s+ ~* {- V
}5 O0 A! R* ^# k& W5 P0 o

作者: 慢跑20    时间: 2014-3-14 09:33
第2章最后开始用链表了,由于以前没有接触。这里要重新学习链表:
+ D0 o7 \$ m6 Z4 ~: e9 W#include<stdio.h>8 d, M' ?$ W$ |4 Q) T: ~

* [, B7 S6 h9 |& m9 A; J  struct node" c8 F6 c4 B  _8 [' h7 V  E/ e
{
* M3 o# o0 }' L- t) W# H8 [. G        int data;: [3 p& `* `) b- F( l2 t5 i
        struct node *next;8 I2 J% q) Q; }- T
};
$ C5 R  @# P* b0 o1 @//typedef struct node NODETYPE;
* t# |0 w% m2 I) |void main()7 T9 A  ^# Z6 Q: z- @% B0 z4 F/ f2 l
{  S8 o, m; C4 m" E* {) y% o
        //NODETYPE: z* z: p# d( B/ |7 l% q+ C
        node a,b,c,*h,*p;7 }  ]! {  T. E/ J' q! T: P
        a.data=10;b.data=20;c.data=30;7 N) @7 O' ]+ m: h
        h=&a;
) O$ ]* K6 l- a7 O; j. |        a.next=&b;b.next=&c;c.next='\0';
$ `; w9 N0 [4 U# L! a% T; L- w        p=h;
/ X: @" H  z- m8 w* t        while(p). j0 \9 q2 M9 Y9 K5 r1 j
        {
" Y9 G; o5 `7 `- w+ k! y' i; c                printf("%d  ",p->data);
# H- \7 F' U) w$ @# L# ?% P# ]                p=p->next;
* ]" I' @! c8 D        }" m  ^* @% p7 s1 ?% S) \
        printf("\n");
, X5 C: b5 G- I+ ~4 C  @% |}/ e1 {6 O9 U/ W- |/ j
+ l( Y1 m* @" m! X; q% v+ ?  \
这是一个简单的链表。从这里可以了解规则
作者: 慢跑20    时间: 2014-3-14 09:38
此代码为生成一个链表的代码:3 g, j0 z) \( A7 F4 G2 K2 W
#include<stdio.h>
6 ~* m& }1 b/ p( O# ?1 V% ~& K  s#include<stdlib.h>
1 ]3 `2 E4 a0 h; t2 B+ Vstruct slist9 G& c$ a) O' W5 g
{
' U3 Z. B! r! b: |5 [6 x- i        int data;: R3 k1 G* q1 X; X  @. E
        struct slist *next;* c  L* `( {5 M% ^6 H" n
}; + d7 {8 P/ W; }8 X% ~) }
typedef struct slist SLIST;. `- b. ]; I, d  q- |: i  w9 i
SLIST *creat_slist1()
: m' d# C, j5 i{
+ y5 F: [' v6 P6 E0 b5 m, R        int c;
: m8 D8 {, D8 {2 w% k1 r        SLIST *h,*s,*r;( N3 Z! f" G6 ?6 B# |' @' c1 A
        h=(SLIST *)malloc (sizeof(SLIST) );  //生成头结点* l7 p7 P% \; T, |) \9 L
        r=h;2 l% j( e" P$ g1 K5 k
        scanf("%d",&c);
' B( Z& u2 r+ `: v9 ]        while (c!=-1)                                        //当输入的c为-1时,代表输入结束
7 l( t) k0 ~' I7 f! n        {
6 A/ h( i4 u* d! ^) J" D8 N                s=(SLIST *)malloc(sizeof(SLIST) );  //生成一个新结点' @6 p$ {5 F) j/ M
                s->data=c;9 \( c; `9 y1 k; j* e; a: z$ ]/ Y
                r->next=s;" Q# Y& p: s# }
                r=s;
) J7 y. V2 ~% c3 M                scanf("%d",&c);
. l& D; H$ F3 |* K$ k4 d& L         
! M7 W" r& {- `3 U        }1 a4 W9 X6 ^1 Y4 O0 `5 N  ~
        r->next ='\0';2 L9 r8 t0 d: t' B9 V
        return h;  h0 P8 w4 a# a  d% y
}
6 [  ~( ^) K; x5 y8 L: t: }; ~# }! w
/*. t' {7 b& ^8 B/ D
printf_list(&head)
* [4 N6 j3 Z) Z) H# _{        SLIST *h,*s,*r;
5 E" y* t2 K" q7 W& T" p! N$ c9 o        int c;: y+ W1 o( |2 c/ b- _4 d
        h=(SLIST *)malloc (sizeof(SLIST) );- `7 N  h( q% v* R* X  R
        r=h;% a% |3 W" P0 \% t% S2 g
        s->data=c;; O% p7 {; q/ j+ p( e+ ~
        //scanf("%d",&c);3 {% v: o6 \6 b' A; o& G
        while (c!=-1)
0 g! S- ]+ i+ l8 U  L        {
; h9 [2 ?# `$ \4 G8 Q; A3 Q                printf("%d",c);, T0 U' b  H8 i6 x
                s=(SLIST *)malloc(sizeof(SLIST) );
" u+ @0 d. |6 o) f/ ]+ M. _                s->data=c;/ S3 F9 F, n. F. [
                r->next=s;$ q1 C1 i" R! K& R) ?5 [
                r=s;
9 S& b/ K( l) \# m5 J               
( {+ j  L  }$ w3 e/ a/ s         
0 r  g9 f  a# p5 w        }  k/ n3 u/ ^0 Q% X& A" X0 E$ a7 a, u+ I
        r->next ='\0';$ m3 n0 g$ N, \( A+ S8 r
        return h;# a- P6 T* J" x, _
}
, q/ L5 e! J' L8 ^+ @: t/ i" G*/
3 g2 ~, a) V0 [void main()5 d5 _% ~; t' H6 h
{ SLIST *head;" F1 Q2 x! b- O& }' p
7 |) B  p- l' g' Q$ ?% O3 Q+ M' U
head=creat_slist1();                //调用链表建立函数,得到头结点地址
9 S/ B0 [3 k! W' y3 Pprintf_list(head)
7 j7 x% K0 Z* E& |" c! ?}- A( u% n  j6 E$ K  g" D/ z6 c

作者: 慢跑20    时间: 2014-3-19 13:54
2。4节需要用链表计算多项式的加法,因此,熟悉结构体是非常必要的。
* V9 C# f! c2 q: w5 p+ T
$ T$ S3 H. m. V% s" J#include<stdio.h>
" ~( l/ P; d( l7 I# N2 {7 j! y0 E #include<stdlib.h>
( ]! M) R. U5 ^5 k+ h: L0 ? + J" ]& ?7 i; H- T7 t
struct slist
( f' P" c& Y6 P/ k5 c6 A  {
$ H7 d$ _/ x2 ~0 z8 @% Y# j  int data;2 H4 q! G  c) Y1 x- ~
  struct slist *next;* ^, y3 d2 @7 p
  };7 y- n- a( a, [2 y2 j- B5 b
  typedef struct slist SLIST;0 K/ o4 Y9 a, x/ p
4 ^8 U# K) v: A# z
SLIST *creat_slist1()
- [! C( O5 M" z& k: M  {$ ?8 K- }, x$ U2 O* ^3 }9 m
  int c;7 f: f5 o) G  W$ X
  SLIST *h,*s,*r;$ X& w* e' }/ A" y
  h=(SLIST *)malloc (sizeof(SLIST) ); //生成头结点) _8 O, r. E) F. _6 I8 Y
r=h;
& @4 p1 }0 x5 s2 m9 o  scanf("%d",&c);
* d# y, ]5 a+ R) J7 D  while (c!=-1) //当输入的c为-1时,代表输入结束
/ N+ v5 h3 c' ?  z6 ~$ J{" {1 V7 a! m* X1 Q: T" M
s=(SLIST *)malloc(sizeof(SLIST) ); //生成一个新结点+ F, }( r6 u4 }
s->data=c;; g. |, p4 u) V# X
  r->next=s;4 y6 S( j% f2 x8 O
  r=s;
$ c* K, S. X. g7 t/ n9 F$ x/ L! y  scanf("%d",&c);
  G7 Z! X% w  ^; R1 `9 [& E; h
2 u. @9 C6 y$ y& }4 `9 v}$ y1 M2 d8 W. M* o3 e
  r->next ='\0';
; x6 d& q% i+ }4 A! K, c, ]  return h;
- T, p! u, h& w9 y2 x  }' x$ {# a8 W* ]2 ]& U" B

; Z8 r4 m; i6 O, O% d/**/  //想加入一个函数,在刚才输入链表各个数值之后,再输出这些值。如何写呢?7 j9 z' }# {) O; q! Y: f
int printf_list(SLIST *h)% _. _) I9 I  S# N" Z9 l" l
  {1 y  X4 ^  R% _
  //while (!h->next )//教材上经常使用这个语句作为h->next是否为空指针的判断语句,但在VC++里边,这一句与下边一句效果不同,具体原因还不清楚( G- \; X$ e2 Z1 p6 U: T
while (h->next!=0 )
! E" j0 d  Z& k4 t& H  {
: A7 T" O# P' O1 ?" @6 n  printf("%d\n",h->next->data );, d( d* |: [; [5 o  E
  h=h->next ;
8 i5 |* K7 q6 e* ]  }
  v: X3 }' i  h  return 1;
9 H* Q! p1 V  c2 d  }
1 \  P9 C0 g) B+ p  b1 j  /**/
* k6 V8 Y# D; p# T# w1 h void main()# y. ^" h" z" k# C1 o
  { SLIST *head;* f) c2 z- ^* H6 s; \2 @

1 `- r2 g2 b, G2 @, khead=creat_slist1(); //调用链表建立函数,得到头结点地址; O7 e; o( d5 k6 I5 _  L
printf_list(head);
( Z% k/ y& `+ h9 h' O" E8 U  }+ w7 ^- Q0 l  D* |2 C3 Y

- `# u* s4 ]- L2 {
( c6 I/ y  c* l此函数功能为:输入链表中的数,然后依次输出。




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