数学建模社区-数学中国
标题:
数据结构,清华 严蔚敏,例题代码(自己写的,持续更新中)
[打印本页]
作者:
慢跑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+ R
void 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! b
int 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& t
9 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: C
li2.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/ T
char *q=b;
0 m, S" z9 Q5 u+ D8 d
char *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/ ]) d
if(*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 N
char 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 f
puts(a);
) p( w/ K6 X: ^! q' w
5 c, y$ i* { q8 k
gets(b);
( {1 G7 U% U5 K: Q* J- n
printf("输入的集合B是\n");
B J: U% J7 k3 e/ D
puts(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; e
puts(c);
* G. v* z$ n8 U0 d# P
return 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+ V
struct slist
9 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 y
8 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 P
printf_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 @, k
head=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