数学建模社区-数学中国
标题:
数据结构,清华 严蔚敏,例题代码(自己写的,持续更新中)
[打印本页]
作者:
慢跑20
时间:
2014-3-10 21:34
标题:
数据结构,清华 严蔚敏,例题代码(自己写的,持续更新中)
本帖最后由 慢跑20 于 2014-3-10 21:38 编辑
* o. b' v o5 f
p/ O3 X, ^: j8 F! ]- a% U$ Y
计算机基础课数据结构,清华严蔚敏这本书是公认的一本好书。
/ l/ k3 N3 V4 w
刚好这学期我们学习数据结构,想把一些例题的代码写一些、既提高了C语言的水平,又可以加深对数据结构的理解,为以后打下良好的基础。
- f3 a6 X) @ ^3 A9 B9 K' E
作者:
慢跑20
时间:
2014-3-10 21:34
本层占楼编辑
4 c: i! y' L. J( ~
作者:
慢跑20
时间:
2014-3-10 21:35
20页,例2.1 A,B两个集合,合并成C集合。
* ?, C! I5 M8 A" }
这个代码是用数组的、算是比较简单的。
8 U" s' v& R& T3 |7 E
& E" ^# q6 }+ u5 Q- Y
#include<stdio.h>
/ H2 M* M' E, {
int L_length(char []);
) g1 U2 s+ a4 C
int main(){
; b; n; X4 A& Z/ }0 r- V1 H) n
void Union(char [],char [],char []);
# N4 d% `$ d" I9 L$ f
* ]% R x9 e6 G5 v9 k# u) ]$ N
char a[10];
" ^. d4 Y8 s! R1 Y3 P: d7 n" b( |6 C
char b[10];
! v+ p# _- j0 _* s
char c[20];
1 [, N. g0 a8 C
gets(a);
' j- h) c# H" E+ q6 Z; x" D7 K! ~
printf("输入的集合A是\n");
$ G6 P8 z6 G0 X5 M
puts(a);
! k' }0 a% M) \, _5 F
! Q. ?. s9 f* i! X' Y
gets(b);
" }! l5 n3 b8 j% P! P6 P
printf("输入的集合B是\n");
, `( n" S2 J7 x; q y
puts(b);
5 `7 \* d* A; U1 j' F0 |; k% D* T/ P
( u" e& P5 f! G) Q6 f% v
Union( a, b, c);
, t& Q0 }% J5 o" [0 B( [
printf("last得到集合C是\n");
2 W- Q/ k' [- G/ D! D% Q& x
puts(c);
' M; z* a+ \& z! }& H
return 0;
5 T( d8 X6 t4 o' m0 D; i
}
4 d$ X8 x& l# n! b1 t
1 J( x% N% B, m
void Union(char a[],char b[],char c[])
, V5 J; L/ ]' w ] W3 [, k6 Z1 P
{
2 @- d) d. N( y! Q3 ^2 v) Z; J$ [
int flag=1,t=0,i,j,m,n;
5 d" Y+ b/ Z/ j8 W2 V1 c( I
m=L_length(b);
- k3 r$ u' J# p; V& t
n=L_length(a);
# K9 z3 H0 `0 \+ Z/ z: Y
for(j=0;j<n;j++)
+ h; _2 ~; f) V V0 F2 x
c[j]=a[j];
$ e* N y0 k V' ~
for(i=0;i<m;i++,flag=1) //i为b数组的下标,m为数组个数; j为a数组的下标,n为数组个数;
. A4 C. K0 h" K3 P% v. b$ c
{for(j=0;j<n;j++)
% g9 i+ z% d) d! J
if(b[i]==a[j]) flag=0;//flag=0,说明有重复的了
8 w3 [( `7 c* S# D$ {
if(flag) { c[n+t]=b[i];t++ ;}
# z$ _7 j \+ X4 n9 f1 ?. V2 T& X
}
( U0 P4 h: @- n
c[n+t]='\0';
' O# T) m6 J$ Y" Y
/ U& |8 H/ p# Z" n+ \
}
% z5 V. z% U* H. |. O- H
t v* `" D5 [7 _9 x2 g
int L_length(char a[])
+ W+ w* t+ `7 ^! @" t' s$ b" {
{
6 \; C' K V. Q3 l& i. D
int i,t=0;;
* M0 [( t* C' t/ u$ T n- f
for(i=0; a[i]!='\0';i++ )
2 W: i0 P1 X6 {9 s, l: G; ~$ D- E; I
t++;
( U8 R. h" }; w
return t;
" ^8 V/ L! n& y: W
}
5 X" d% W9 m/ U# G2 U' M* q7 l
( K% w2 M" A5 \; n# W5 @0 k" I
作者:
慢跑20
时间:
2014-3-14 09:32
本帖最后由 慢跑20 于 2014-3-19 13:53 编辑
( }+ s* m' Q% g
, {7 j* P. j, l8 L: q& P! ?
li2.1yong用指针:
* i8 Q! J# ?" i" H5 W$ @
7 K5 S+ R" L3 T4 f
#include "stdio.h"
, e3 h; z" ^1 I# l* f2 [' `& f% U* `
#include "string.h"
% T9 O2 W& t9 B* J1 L% ], x
void Union(char *a,char *b,char *c)
& b3 S/ X% ~% c
{
' p: X T. Z+ v/ c6 j. x" U
char *p=a;
; [1 _+ P0 |. B3 c) M/ B
char *q=b;
9 k& o: K# k# q4 K
char *r=c;
; G' J# n/ h/ _6 n
while(*p) *r++=*p++;
+ g0 L/ h0 e7 [2 M8 C
p=a;
9 F; |0 ~' E- a+ r2 q
for( ;*q!=0 ; q++,p=a )
# n% Q9 |3 _! `$ n: ]1 _& l
{while(*p)
+ ~% G; _% l: J0 v$ V5 _! y" z4 G3 d
if(*q==*p){q++;p=a;}
+ l7 L6 Q% ]. F& ]9 u$ k$ A( Z
else p++;
% j& A, M8 c: ?* X. _: ]
*r=*q;
# e$ T! p& u; {# N' r
r++;
( W2 `* p/ O7 L6 d% \5 J
}
* W f/ j: ]6 |3 z7 h- m, F3 b4 Z
*r=0;
$ B5 s+ C8 E% h9 v+ Z* G
- w( u/ H, {! r+ `, D0 e' v- s
}
6 V: o+ J) G6 n/ ?' @9 h3 m4 u
5 r0 W: n& D- U) L
int main(){
% h) U3 a: |7 R" K, B" k
+ I9 l$ U( O; t8 y" h
char a[10];
4 `( I' s. ~4 \/ r, R
char b[10];
) u* C/ J/ P1 i; `7 j% [* O
char c[20];
- U* a; v- |- c2 }
gets(a);
8 J# X% Q/ s! g' n. s
printf("输入的集合A是\n");
7 g# ?' ?) J/ D" i* }
puts(a);
' Z8 H8 N9 A; ~. U+ S- W$ D
; R$ u3 W0 B# C4 ?3 N9 q
gets(b);
1 k- I# Y- y4 r; [
printf("输入的集合B是\n");
5 y( v( s# L( a4 S/ c' C) l
puts(b);
& ]& M" D5 F- ^
9 Z# `: U! D5 z" F
Union(a,b,c);
% _; e3 x+ y7 @
printf("last得到集合C是\n");
& x- h8 @( B* S' w( E' N4 _$ ~
puts(c);
9 c9 W5 _! I# T" r H
return 0;
1 V" P2 e% d5 d1 g$ \7 _
}
) ?5 h+ q( c8 W1 ?! R5 c6 H
作者:
慢跑20
时间:
2014-3-14 09:33
第2章最后开始用链表了,由于以前没有接触。这里要重新学习链表:
& v+ F* S6 l# I% J* f
#include<stdio.h>
6 Y5 n( d6 K: A o- T4 R' T9 s
9 Y" p, z* c* a) S4 U% A! `5 @
struct node
. u, z$ A7 `) o/ i
{
2 U8 ?9 t, y) V6 L# M
int data;
% A) B2 m9 k& I" A( r1 D& r
struct node *next;
) [0 l5 j1 S$ W& h! X9 x! m' b
};
6 Y2 o0 L9 k! i& S
//typedef struct node NODETYPE;
. S' L; {: |5 f8 F9 V
void main()
; I Z2 f5 m; R3 D) [! D
{
' P+ w" t) x; J0 [; o
//NODETYPE
& n. m% Q4 ~) V1 t8 a
node a,b,c,*h,*p;
: f) X6 a3 L1 T' {8 W$ _
a.data=10;b.data=20;c.data=30;
1 [" ]" Q0 y7 U$ Y7 K! Z- }
h=&a;
1 y4 M! w; N. |9 f Z$ x
a.next=&b;b.next=&c;c.next='\0';
( r# ~: w( B+ H* d/ _" t I c1 Y7 `
p=h;
$ u. \, j3 h; g9 P5 m9 g$ T' r% |
while(p)
- m2 |6 s- l# V
{
* ?& O5 R; z! s! e" Y1 V+ n9 e
printf("%d ",p->data);
: O/ j8 g- j8 Y: {9 y# e M) H
p=p->next;
8 b/ k) G3 O. i
}
2 K$ k. o. h6 K+ Z% j% K
printf("\n");
6 {; Q2 n3 f. z% h. c% |4 I
}
! H# G+ D8 [ k) s
' u" W' g9 T- z& ^
这是一个简单的链表。从这里可以了解规则
作者:
慢跑20
时间:
2014-3-14 09:38
此代码为生成一个链表的代码:
9 w9 H* I4 X4 C: \
#include<stdio.h>
+ K/ ^3 F6 y4 R( h$ p( N5 D
#include<stdlib.h>
; v/ C5 t# f6 E0 m$ `! [
struct slist
& v0 G5 R( I& \' H
{
' r! T# x0 O, R; k/ R" e
int data;
E: n" O; x& r. @ `/ ^ {
struct slist *next;
7 J" n5 D# @7 B8 V# q7 {2 \3 P+ r
};
: X, n$ d, Q# Z# }; k2 H, |' C
typedef struct slist SLIST;
) U( k) I# J2 j: `. \$ @, a
SLIST *creat_slist1()
, n4 h5 N! p0 _1 ^9 M+ Z
{
3 K+ d# U0 [; q+ i
int c;
/ ~! W- P2 a$ ~3 A5 W9 ^6 i: ?. D$ ?% G
SLIST *h,*s,*r;
- U Q# N4 F2 P+ Z
h=(SLIST *)malloc (sizeof(SLIST) ); //生成头结点
) I4 P X6 Z9 T: |9 G! @% O
r=h;
' I1 O5 Y& S, m5 [- S) ?3 [4 G) L/ e
scanf("%d",&c);
7 T3 v( ~( R; e' @
while (c!=-1) //当输入的c为-1时,代表输入结束
* F" V1 i! C4 q7 q7 r! D
{
' T) p1 v% w& k% M& }4 T
s=(SLIST *)malloc(sizeof(SLIST) ); //生成一个新结点
( _$ W" V( i X2 ^& [5 c
s->data=c;
' f# i) p& |' X) x& H1 W
r->next=s;
; s. w' ?$ p. \5 q% J y; r
r=s;
' h, J2 P1 f9 t/ D/ |- _: d
scanf("%d",&c);
, g. `( G j$ Y( j& f4 V
$ H! r9 _6 l1 [% r u K/ o
}
7 B4 }8 u7 F) h) }, i
r->next ='\0';
: U! O) Q9 j4 N, Q) @; m% j
return h;
- O5 ^5 p; L! g& V( q3 _
}
/ P) @1 K+ u3 a1 K& c( o' @
4 k3 H) D- v3 |8 p) ?' ~% w4 r& P
/*
- w$ O) t3 S7 `$ T7 c/ [
printf_list(&head)
4 R: I# k3 r" |2 f! g, r
{ SLIST *h,*s,*r;
: \# E" V7 N) `& v# L, q# m6 s! X
int c;
1 J7 a/ Y$ R& y$ M
h=(SLIST *)malloc (sizeof(SLIST) );
, ~% p6 b/ _6 Q `& D
r=h;
( ^; ? Y) r0 V2 n$ x1 x* P7 ^
s->data=c;
0 E4 I) `; V) i' P2 T9 d( R
//scanf("%d",&c);
8 |$ f7 A/ d) `3 D7 i* |/ O0 p
while (c!=-1)
# B# z/ _/ q) P/ }. R8 X. [
{
; I1 _& Z$ V8 {1 L3 T
printf("%d",c);
/ W, A8 [! x u% [9 m
s=(SLIST *)malloc(sizeof(SLIST) );
& y, m- A! \( _% m0 X
s->data=c;
% [: z! P9 Z2 _/ y5 E/ N
r->next=s;
) U' |% G8 D- v. b5 e
r=s;
* b5 z3 I3 ? E8 i' U& y9 k7 x
7 ^, O$ Y6 i8 C5 h/ L# m# r
( { I! U" e# \4 a
}
" M, O _ T- N8 v
r->next ='\0';
, Z/ `+ k/ R4 f
return h;
% R3 x! q3 h+ d
}
: w$ s$ s& p2 D
*/
% P9 T" P; M: O2 l; s7 S
void main()
% z p% @& e+ D& w9 L; D* V) G
{ SLIST *head;
+ Y& g Q5 I! i0 }6 n
0 C' R! Y2 }: W* X
head=creat_slist1(); //调用链表建立函数,得到头结点地址
1 {. ?) e- ~) u# W5 S; Z
printf_list(head)
) l; }# D P( d3 E3 q7 `8 }4 q
}
* i6 l2 S2 W% T
作者:
慢跑20
时间:
2014-3-19 13:54
2。4节需要用链表计算多项式的加法,因此,熟悉结构体是非常必要的。
* w3 q6 z% {) G) o$ P; v
8 d. J3 S* h2 P5 h: _6 @" b* X% b9 Z
#include<stdio.h>
; c3 R+ f4 g$ H8 V( \, h
#include<stdlib.h>
u3 J& y4 z1 S1 E F5 Y8 ?- C6 f
; [- g1 j- N5 x* ~$ B
struct slist
2 ^" [# L& o, v/ \7 E2 o9 c8 U
{
- s+ Y8 ?: d( ~, s5 D$ u5 I
int data;
( p' Q/ u5 B1 Y# _# I$ I
struct slist *next;
7 C: E, c3 J: b" X5 E( i
};
1 h8 @" o# e( J/ K8 l0 S
typedef struct slist SLIST;
j- f! |7 _% ?; h" X: P
0 O3 ]6 b, X+ B
SLIST *creat_slist1()
8 ?5 N2 ?3 T0 V
{
9 q8 A& |: z' l2 y$ u4 V
int c;
3 p% _5 t7 w; ?4 q
SLIST *h,*s,*r;
) ^7 P( U0 D! i
h=(SLIST *)malloc (sizeof(SLIST) ); //生成头结点
0 p+ @' ~8 {1 e: Q
r=h;
1 X. Y1 y3 G) h* ~9 Q+ a
scanf("%d",&c);
6 x1 n) o. z& q! }6 ~+ Y: h
while (c!=-1) //当输入的c为-1时,代表输入结束
4 F6 x6 V5 }# M* h Q
{
% c1 j8 @# n: H
s=(SLIST *)malloc(sizeof(SLIST) ); //生成一个新结点
" T( i A5 S4 g: Y/ E, U) w. K# q
s->data=c;
3 B8 A+ u4 N- `- ?, |
r->next=s;
* |( V2 a' f5 A5 F7 ]
r=s;
$ e+ y u, z% @: z5 W
scanf("%d",&c);
7 E! f/ t7 q( c# W# P
+ S' _9 A+ C) w& d
}
6 u7 A; u- X) d- x5 i6 |
r->next ='\0';
, m: \* t \7 A' V4 F
return h;
4 P' \3 a2 @7 l- [/ l1 y
}
( n! ]2 Y: I# b* j0 `- E
8 @3 F$ s5 r& [1 |! q4 O( \
/**/ //想加入一个函数,在刚才输入链表各个数值之后,再输出这些值。如何写呢?
0 q7 f% e2 e7 z3 e" v
int printf_list(SLIST *h)
# U' A& }; u% o7 ]8 Y0 p3 B
{
B& r8 G! s. ?/ Q7 k
//while (!h->next )//教材上经常使用这个语句作为h->next是否为空指针的判断语句,但在VC++里边,这一句与下边一句效果不同,具体原因还不清楚
* J, Y }# u, @# B9 r! a o1 `
while (h->next!=0 )
8 e1 R* g% d& ?4 q" P* f o
{
# j5 \ k* `5 ]/ |& [% Q# P! ^- y9 c
printf("%d\n",h->next->data );
2 _, m2 v' H( T
h=h->next ;
\2 t5 Z9 i3 Z
}
, M$ ^$ h8 F. w6 @5 T
return 1;
5 w& x* w* I$ B& h8 q* h
}
, W* G5 l' f4 @$ N. M8 ], y- c: d
/**/
3 R% p+ f8 S* K; ]3 ]
void main()
( {& t* F5 t, y1 G) {, }
{ SLIST *head;
' C$ @9 b' @/ n+ `+ b
; ^; f) a/ @7 \. T2 u
head=creat_slist1(); //调用链表建立函数,得到头结点地址
( M; p6 S7 t. c' k$ h) B; L
printf_list(head);
" C: V8 C' [2 d& m
}
( y' E9 l Y- v# r
% [% s a9 G/ M( O M
; j4 D) T7 |/ ? O! s* [
此函数功能为:输入链表中的数,然后依次输出。
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5