数学建模社区-数学中国
标题:
数据结构,清华 严蔚敏,例题代码(自己写的,持续更新中)
[打印本页]
作者:
慢跑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 @$ E
int L_length(char []);
0 a) ~) k( w2 m8 m
int 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: Q
int 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& A
li2.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 n
void 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; p
while(*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& d
else p++;
# `4 u' B3 l* ?- z( Q/ I8 W# s, }5 v
*r=*q;
2 G/ B. `; Z2 \, Z
r++;
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 H
char 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$ a
puts(a);
& A- r7 o6 t4 D8 x% q0 T
8 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( v
Union(a,b,c);
% @! U7 M$ O9 |6 N( A
printf("last得到集合C是\n");
" x t1 Z3 G9 B0 k
puts(c);
4 q Y" z1 y5 q& l) i3 p5 L
return 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
//NODETYPE
3 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: N
struct 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 s
typedef struct slist SLIST;
6 j" e" P& n* v6 e1 A3 M7 K
SLIST *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' H
printf_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" X
printf_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 slist
4 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+ e
s->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 t
int 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 x
printf_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