数学建模社区-数学中国
标题:
数据结构,清华 严蔚敏,例题代码(自己写的,持续更新中)
[打印本页]
作者:
慢跑20
时间:
2014-3-10 21:34
标题:
数据结构,清华 严蔚敏,例题代码(自己写的,持续更新中)
本帖最后由 慢跑20 于 2014-3-10 21:38 编辑
5 M' _2 \" t n5 B- W
( r" r% V. ?" e% h, n
计算机基础课数据结构,清华严蔚敏这本书是公认的一本好书。
( U m8 E# C+ B5 ?
刚好这学期我们学习数据结构,想把一些例题的代码写一些、既提高了C语言的水平,又可以加深对数据结构的理解,为以后打下良好的基础。
: a% F3 K* F! t- h/ ~3 a
作者:
慢跑20
时间:
2014-3-10 21:34
本层占楼编辑
. ^3 c) Q' {" j* Y% X5 p% Q
作者:
慢跑20
时间:
2014-3-10 21:35
20页,例2.1 A,B两个集合,合并成C集合。
" X1 n) P9 D4 Z4 S7 v G6 Q- J
这个代码是用数组的、算是比较简单的。
. N4 R5 z/ `# w1 z+ N* _% g6 E
3 b- B( a" Z: g+ h2 ?# X! u
#include<stdio.h>
8 w1 Y: Q1 U0 ~3 Q+ K8 n
int L_length(char []);
- s8 Z5 |# `+ j+ b! u# f& O x; J
int main(){
4 l l+ P5 k- G- x$ b3 }4 b6 I
void Union(char [],char [],char []);
' [2 N2 m+ g1 v" ?& }7 B3 t
7 {9 N+ w9 v, I' ~, Q
char a[10];
* o% j* ~- l7 p! o8 i7 ?1 ^
char b[10];
! @# r! X1 S$ K: a+ x; u
char c[20];
8 K8 U$ i5 ?+ P& y4 S
gets(a);
3 S( Y( |+ ~6 }$ R. r
printf("输入的集合A是\n");
, ~% ~: k( G/ m) b9 j
puts(a);
' `6 q, Q1 B( }, B, A% ?
, e! _+ }. V2 Y) S
gets(b);
# U5 L3 B# [6 D, y
printf("输入的集合B是\n");
4 n5 K5 a! W" P8 k2 v
puts(b);
- \- I, g5 T$ J% E" F- b
) r2 f+ z6 J- z0 r- M
Union( a, b, c);
0 u! y& C% O/ g; ^8 w& R1 L+ b
printf("last得到集合C是\n");
' T- D; H& Y: K! \) K
puts(c);
4 f7 u- q9 M+ ^
return 0;
7 t0 ~. I; u( x5 I8 I
}
2 Y! f% `5 Q0 Y, y; _ `# X
: _5 k( {' x& T8 H3 m. F$ W
void Union(char a[],char b[],char c[])
8 d9 X5 ^3 r* ^
{
8 ^4 W+ h8 K. P7 p+ b+ h& b
int flag=1,t=0,i,j,m,n;
$ ?/ V. U# ]$ V4 |
m=L_length(b);
- t2 I8 B. O% J5 E9 m; j* L+ X
n=L_length(a);
3 _. h5 R- G i1 }
for(j=0;j<n;j++)
1 o( f; S) A1 c; d0 v' o
c[j]=a[j];
" i' r6 e; k4 |; H% ], V: |/ m
for(i=0;i<m;i++,flag=1) //i为b数组的下标,m为数组个数; j为a数组的下标,n为数组个数;
& n; z' Y' }* @) ]: q7 W7 e( _
{for(j=0;j<n;j++)
, e' ~1 ]# t$ \! N `# `0 b6 L! K
if(b[i]==a[j]) flag=0;//flag=0,说明有重复的了
# e* q$ M W. d. B5 P: @% h( `
if(flag) { c[n+t]=b[i];t++ ;}
- B" i. f4 B t+ m" \& @6 i4 f
}
% G: q3 ~9 d1 T# h6 h
c[n+t]='\0';
) `) e9 `& |3 _* R
& A3 Y; M% R9 q) O) n* Y
}
" F) Q, R6 \" m* ^- P+ E0 _
2 ]2 o, e! n2 J" a/ w7 Q
int L_length(char a[])
2 s9 u& J% ^4 b8 @7 r5 u3 V0 T
{
. v* z& i M4 X% n J0 b
int i,t=0;;
% m4 V m. E4 S! \' f
for(i=0; a[i]!='\0';i++ )
! B3 i G% q8 }$ W* m5 [* N
t++;
$ w: D+ g" E' G1 j$ s; N
return t;
: x( c0 s. F- }* U1 h
}
( n0 S) y [. |) K9 F T
# w# [" \( L" w0 P
作者:
慢跑20
时间:
2014-3-14 09:32
本帖最后由 慢跑20 于 2014-3-19 13:53 编辑
7 G" A3 y0 a5 k0 u+ ~
% K8 x9 s3 S/ L1 H' {
li2.1yong用指针:
; V0 x5 M( h& ?
+ F/ }& h7 S7 D5 U1 c
#include "stdio.h"
0 w& U. u' y! d! L4 o1 S2 k
#include "string.h"
; ?" Z7 |9 m% Z4 k
void Union(char *a,char *b,char *c)
( ~% E S* {4 I7 y
{
& u9 O+ R6 ~! L
char *p=a;
5 v$ Q: Q }( l6 o1 S& e
char *q=b;
+ M5 O1 |1 r# v( p8 a% T; e! }/ D
char *r=c;
2 Z& P0 ~5 Q0 Z/ r; h* ~0 H
while(*p) *r++=*p++;
, P* A# m' n8 _, X. J
p=a;
0 x* @& K$ t# E5 z
for( ;*q!=0 ; q++,p=a )
$ I/ q- k5 A2 Q% T R7 z# e7 u
{while(*p)
1 z3 K' f. E4 D& n6 ~- T3 D
if(*q==*p){q++;p=a;}
$ h* _6 i1 v, F9 d' R
else p++;
7 d. s% l7 ]6 t! ]; o9 [" i' p
*r=*q;
$ X' e9 s& y% D1 A% C* o2 Q
r++;
; {+ l" b) l) J. C3 N- ]
}
; v5 V# d! u- j. `! }8 X$ p2 ]& ?
*r=0;
, A* e/ [9 r: m5 e+ B( Z y7 `3 l- k+ \
$ l; Y+ P& p4 l+ ^6 d) Z& c
}
+ ^ r# V5 B+ r% j9 l( l2 y
/ L" U% P% f- X0 s2 N+ Q# ^+ n
int main(){
2 z+ B7 \4 o- N( y4 R
" w5 |( J- t& A" T2 ~& I, k) a7 D
char a[10];
# x1 A& w4 E) d9 Y0 Y4 T/ F
char b[10];
0 B$ ^' U5 S8 N2 u. L! t4 \
char c[20];
& E. _& Q" A5 R. U& d
gets(a);
/ p; w# W7 H! @8 @2 E3 N
printf("输入的集合A是\n");
+ ?! @" m3 s) p
puts(a);
& T6 d) `! r4 F% i; A1 s6 U; ]% h
" |2 Z8 \. s" G+ Q2 \
gets(b);
+ E! j% Y0 }, ^: v6 G# q
printf("输入的集合B是\n");
9 a% A. ]" B+ G0 M* h+ J9 c: S' l$ v
puts(b);
7 f- z* p! {; _' @5 ?3 ]. P
: O$ I4 M; }- j' Y! R
Union(a,b,c);
$ b0 V$ c P* M7 T/ h+ Z2 x0 V
printf("last得到集合C是\n");
+ j/ Q# r( Z f0 y( i
puts(c);
' J) e3 L( e Q, u6 j, p
return 0;
" a0 k$ t" o4 H# W
}
+ s+ `/ ]9 D( @# d" m" @
作者:
慢跑20
时间:
2014-3-14 09:33
第2章最后开始用链表了,由于以前没有接触。这里要重新学习链表:
& e' J' u- l3 f9 q0 |; J6 L( X
#include<stdio.h>
: b3 }' S q4 C) n3 X* d% o4 S' n4 @
# c8 u2 k4 N; ?# J
struct node
" K0 O" f! O2 s! b8 ]4 }; }6 m" [
{
6 s0 {1 Z0 d4 k! I$ k1 r+ Q
int data;
" _* o q% u2 f5 y( p2 R
struct node *next;
( `3 d8 ]) A! T. w- ?% v* ^
};
3 o' O# v9 e, v& a! {8 q* j* M0 b
//typedef struct node NODETYPE;
) | i( y3 x; h8 F& ~- y
void main()
2 A; [' y9 Q; m5 V3 z0 w3 ?/ r
{
5 A$ n$ L. ]% h% J
//NODETYPE
5 }4 M, U0 {) Z7 L& _
node a,b,c,*h,*p;
( j! P4 O1 N6 r/ q
a.data=10;b.data=20;c.data=30;
& g/ n4 e' K& ^5 I; e) i
h=&a;
# M; r6 e+ G/ T) p
a.next=&b;b.next=&c;c.next='\0';
0 ^6 M; N& R q
p=h;
- F3 D' R1 x8 D3 d+ M7 r: W7 f
while(p)
* x; w6 f7 L- o: x9 Q
{
0 O' K) u7 h4 @+ M. M
printf("%d ",p->data);
3 l& N& H# E+ f5 C+ I2 `+ P
p=p->next;
1 j4 w; ]( M* U# M, a! H! i6 R: T
}
6 g( F: J& d5 @3 C( n5 P$ q
printf("\n");
0 H# w: M, I% u# D, }# Q3 {
}
/ C6 r' y. i, a! a+ n
9 T2 P1 ]9 R+ S% o* _' n$ N
这是一个简单的链表。从这里可以了解规则
作者:
慢跑20
时间:
2014-3-14 09:38
此代码为生成一个链表的代码:
# {/ { j, }2 Z" P6 B
#include<stdio.h>
) |& M+ s, ?/ c% j
#include<stdlib.h>
; k* S, |$ z, i1 W8 V/ G" w" I4 Y9 m
struct slist
& ^9 s: k( F' P7 f! M
{
0 L" Z1 X- k2 z2 A. V8 x% U
int data;
- u2 J( Y! o7 p6 j# b
struct slist *next;
) t2 q1 E0 d+ K9 R
};
$ k3 D" U9 L% p3 ]$ u+ n
typedef struct slist SLIST;
) L T; }1 y/ e) v8 k" `& h* P9 p) {
SLIST *creat_slist1()
& e& l( t/ S, M& ]1 O
{
! p: _3 _6 `) l {& H L
int c;
" T* H$ ]& Z2 T7 U0 u4 ~4 A
SLIST *h,*s,*r;
$ \3 `+ W9 E- C5 f$ t$ \
h=(SLIST *)malloc (sizeof(SLIST) ); //生成头结点
: t7 ]8 ^& t7 K
r=h;
- ?* `5 d' l0 e' L+ \9 Y
scanf("%d",&c);
+ X/ i$ N2 ~% s# F5 F- Q
while (c!=-1) //当输入的c为-1时,代表输入结束
5 k" r$ }/ L! y* A9 i0 w. ?
{
% V, b( r: v" t( H$ _
s=(SLIST *)malloc(sizeof(SLIST) ); //生成一个新结点
; t: P# @: ]( I: z9 n' L
s->data=c;
+ ~5 T& o. ^ Y3 B2 N# {/ K
r->next=s;
8 n# a2 H4 [- h1 U" A& }
r=s;
0 V9 Q7 F* Z% R! E% A
scanf("%d",&c);
- r: b+ W5 n7 w5 o
. J/ O5 f3 k ]
}
. @- D% a( ]7 a1 Z9 h
r->next ='\0';
3 q+ d1 J! e7 n& Q8 m1 O0 [
return h;
; l( H. @% G3 {/ W1 M
}
3 f6 o! L# W0 @
& O% q8 {, _& }( e3 t) X
/*
+ c4 c* m% X8 E, C
printf_list(&head)
7 R/ R- r! J) H6 ?
{ SLIST *h,*s,*r;
0 H! g& g' M2 L9 ~ ]3 ]9 ]3 f
int c;
: T4 M- g* E3 Y4 D' }: J: g- r( W
h=(SLIST *)malloc (sizeof(SLIST) );
" ]! ^: n3 ~& g- r* z: y7 @# X7 j
r=h;
, I, G8 E: M; d6 G3 W. _
s->data=c;
- C* s* |0 g7 x* V0 s* z
//scanf("%d",&c);
0 E# ?! ~+ R2 Y# D) O0 B
while (c!=-1)
% _+ n+ m# f m; ^1 {
{
* f8 J' _: h1 C; q: ~
printf("%d",c);
$ U6 Z: @$ \3 t
s=(SLIST *)malloc(sizeof(SLIST) );
6 J6 V$ U5 F* G" \9 e
s->data=c;
9 ^' e) G* Z; S5 L. \
r->next=s;
" y" C" p' X2 p
r=s;
6 k2 m( n5 W0 M
' N9 C' m) I l2 a6 x
& D! E- F9 T, s7 H# l, @
}
2 Z/ R7 [9 l* j4 w4 K) o
r->next ='\0';
7 u# T7 i# ^1 V* `# t
return h;
9 R/ n1 e& d# L! C
}
! h; t: ?3 i* V5 ?2 y; R7 Q& B
*/
1 h2 s5 L* C- j: M* s" m
void main()
7 j3 g" c1 R3 d! `4 k
{ SLIST *head;
+ y! N5 s% ^* W1 _
. L3 m( }' Q7 A; D* v
head=creat_slist1(); //调用链表建立函数,得到头结点地址
1 j3 w3 @5 K$ o, S) J. h+ f
printf_list(head)
! w, Z4 V: _. q/ |
}
2 J4 ?/ d0 t2 p8 b- @: t( b2 B7 \% d
作者:
慢跑20
时间:
2014-3-19 13:54
2。4节需要用链表计算多项式的加法,因此,熟悉结构体是非常必要的。
/ U) m* i7 ?- h4 O( _4 B
$ [4 q+ _2 R& ]$ J' o
#include<stdio.h>
1 z$ v3 @3 B+ {5 r$ W2 L0 Q
#include<stdlib.h>
( x8 q0 X* C7 \/ T/ U
8 c! Y" }$ n) S( r. k
struct slist
6 \4 o9 N2 G8 I# T6 A, n
{
9 G: e3 o$ ?( Q" Y) B$ V
int data;
Q3 O4 D1 z2 J& o. Q7 m
struct slist *next;
# d! G# g5 V$ U# C. G+ I1 A6 G& _
};
7 i2 e% b8 q# O! G2 ]7 X5 u; ^
typedef struct slist SLIST;
1 `- E, z0 n$ W; D) j. Y
( h* J; v9 R* R* B5 ?
SLIST *creat_slist1()
) M2 C! o# \) ]
{
& S! u+ S+ S" l3 \
int c;
4 @- B/ E4 Z) I j( z0 M
SLIST *h,*s,*r;
0 g6 H* i6 h6 K7 [# ?
h=(SLIST *)malloc (sizeof(SLIST) ); //生成头结点
9 O" {$ s9 ]+ z+ g8 p9 \$ O) Z
r=h;
+ h/ d; Q) t) \# o4 Y9 f6 E) z
scanf("%d",&c);
1 K0 V6 F: J# t3 }. ?
while (c!=-1) //当输入的c为-1时,代表输入结束
/ d# C. d! L# x9 x6 Y! N3 W
{
3 t7 f" B8 T: y( Y( e/ @8 [
s=(SLIST *)malloc(sizeof(SLIST) ); //生成一个新结点
! a8 h( l: T! j; d* O+ W1 \2 e& u
s->data=c;
1 c$ s, D& d3 e# V, M* ]. m
r->next=s;
6 c Q$ p. d: y
r=s;
2 j- g( d6 c# J) e+ m4 h7 P
scanf("%d",&c);
4 [" X! P% Q2 C% W4 s& y( p# ]
( A, c* V, r4 R; A) g
}
6 {$ u1 f2 J- b! c7 X! W/ s7 H
r->next ='\0';
4 x' m$ l( |+ i- e1 w" ~- _
return h;
8 [' @* j0 |) _; F* d* U
}
h* W5 r) @( P$ w
, F' M( |5 [* F# C
/**/ //想加入一个函数,在刚才输入链表各个数值之后,再输出这些值。如何写呢?
! w+ y0 h; F9 U. Q% S3 Y1 r
int printf_list(SLIST *h)
0 d: E, n1 {1 e
{
' g9 e: Y9 x5 l) F/ o6 T1 o U
//while (!h->next )//教材上经常使用这个语句作为h->next是否为空指针的判断语句,但在VC++里边,这一句与下边一句效果不同,具体原因还不清楚
2 {, h# [6 ]1 k' Z6 {- H6 O( a5 K
while (h->next!=0 )
3 P+ J- C K1 `0 t6 [
{
2 d- m- Y0 E* f( V/ J
printf("%d\n",h->next->data );
; Z% C" k4 d$ c% d5 Z
h=h->next ;
- a; D% l" F+ i8 A! T1 p& v
}
( a. B! f. Q1 \
return 1;
) o. y3 _; g, i- o! `
}
9 Y+ D2 l: B9 r* i5 U( {0 T/ O9 ?& Q4 [
/**/
6 B0 _" q& Z: u. Q& I- v
void main()
, N3 ^8 L- C7 o
{ SLIST *head;
Y$ m" P7 \- d$ ~
- G* U' K @& |
head=creat_slist1(); //调用链表建立函数,得到头结点地址
: n7 u/ ]4 n7 ]5 l% b+ g
printf_list(head);
4 _: g0 `2 Z( }9 [
}
0 e8 x) u5 F4 {5 H9 O4 Z
" C$ x# _7 f8 y9 N, o: s" a2 B) \7 h+ F
+ m1 F) O: b9 x1 z/ m1 @
此函数功能为:输入链表中的数,然后依次输出。
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5