|
- #include <stdio.h>: s7 U/ e+ L2 |) X/ t; @4 y# @
- #include <malloc.h>4 O$ V8 q, s1 t
- #include <stdbool.h>6 U! F) m4 ^7 P- q9 D1 F$ V
- typedef int DataType;
% q' q6 n& d, |4 P ?. E - typedef struct linknode
: ^2 {0 n0 J$ t* u - {$ P/ Q. q: Q8 i7 e" F8 K
- DataType data;
F7 f+ W; x; ~; }% q - struct linknode *next;//deference
7 J" o4 A$ U$ `& R. M5 q2 Q4 Q
- X9 |% u3 V% v5 `! Z- }Linklist;' \' f; W9 d# i7 ~
- //初始化链表
+ _; ]- c# {! v( |7 P# s4 T - Linklist * InitLinklist(); e `# ^( S. W7 o5 a1 @+ a" W
- {; ^: ^2 _& H& F0 T, u$ g
- Linklist *head; //定义一个结点类型的指针head
6 V+ _/ f7 Z: K/ j: r - head = (Linklist*)malloc(sizeof(Linklist));//为head动态分配空间# }8 o8 E1 A# X9 }. G* o5 E5 K5 J
- (*head).data = NULL;//让head的next(指针域为NULL)6 _ n. t5 D/ _% ?
- return head;0 b! ^* Z. r* ]7 x
1 \* {& L( o2 ?. F1 u- }
2 |4 L8 B( o _" M$ L* [ - //头插法存放数据
4 |- e0 g. o0 d5 l2 r+ W/ E/ j - void CreateLinklistH(Linklist *head, int n), }0 t0 m' D3 O# @( i/ W
- {
q7 D! ]5 }7 ?' F+ v - Linklist *s;! F3 T+ w- n0 r- U
- printf("请输入%d个整数:", n);: b- b2 U' l; ?' b5 _0 r
- for (int i = 0; i != n; ++i)2 @6 V8 L O- R/ S2 q
- {0 n. _( a2 M: p" s1 K( T
- s = (Linklist *)malloc(sizeof(Linklist));$ f; l/ B7 n; _$ ~9 F, _
- scanf("%d", &((*s).data));
) O7 h2 a6 s2 A: G J2 _3 o0 F - (*s).next = (*head).next;+ _7 S4 X/ }- @: Z a, q i/ \
- (*head).next = s;5 X/ h6 R- V8 A% F3 P
- }4 F4 x5 J1 W) \4 A+ f
- printf("创建链表操作成功");
$ G# B5 n& D+ { - }0 w9 v+ L4 B1 k( L- o
- //尾插法创建链表8 `5 U$ P& l! Z7 n- L! d
- void CreateLinklistL(Linklist *head, int n)
% X# k( N+ p, ?8 R: @1 I - {2 G4 ?+ v+ ~- F$ ]6 A
- Linklist *s, *last;% k9 K, m1 u$ P* U
- last = head;) R$ b5 k9 X: P+ i
- printf("请输入%d个整数:", n);
3 [0 u% K* N! ]( `; U - for (int i = 0; i != n; ++i)
" T" G- g- Y A t* \ - {8 |9 s! }; h( o
- s = (Linklist*)malloc(sizeof(Linklist));
2 l5 R# @' S& W. ^( d$ Q% e# \ - scanf("%d", &((*s).data));
$ @& V7 O; u M0 M1 `* q5 v) e/ j - (*last).next = s;
6 X4 A$ C- ], @* h5 d& \1 I - (*s).next = NULL;0 F9 [6 B+ a6 \4 s! m4 S% n
- last = s;1 X* y0 p* w3 T/ X5 Z5 Y1 t3 X
. z5 \7 F* O" n* E( [0 [- g- }8 Z2 Q( R7 {6 p1 J) Z* G. m5 N5 ~0 W
- printf("建立链表操作成功!");5 ^! d. J$ V2 C ?
- }+ G5 y; p$ M: A. s
- //链表长度8 q" }% H4 d0 }( K3 B! x
- int LengthList(Linklist *head)' `+ a- [* ^. x/ ^9 k' C: ^
- {
) g+ J+ O% a3 N2 | - int i;0 B2 X+ ?5 |! o$ |9 v; R1 x
- Linklist *p = head;
; v' u+ }$ F, ^3 Z - for (i = 0; (*p).next != NULL; ++i)" Y8 ^8 K, J* f# U0 @+ h4 U# I
- {
5 j9 S) V* i% {8 u9 z - p = (*p).next;7 v5 m! a& \5 W2 b$ w
- }( q' r% z c1 N
- return i;# ^) s; H- A- U) V: I+ C# {1 v" H
- }+ e2 a6 |% |2 q, f( O, J
- //查找位置
1 |; w: A% T+ r" I' G - void Locate(Linklist *head, DataType x); v" V) r9 i( b u# l4 `) k
- {" ]4 j& N/ r" N* j& Q
- int j = 1;
; j$ e9 d: j5 t* S2 E1 m* v - Linklist *p = (*head).next;
" X( }+ f( }$ E. z9 q! T* s* j - while ((*p).next != NULL && (*p).data != x)/ s7 B+ a4 l7 ^: q) K
- {4 [# z z2 b& i+ [5 \
- p = (*p).next;& c' V/ b9 h6 E+ w
- ++j;8 K& r7 Q4 r& O) \1 ?" `
- }9 O- z$ f/ }0 N' O! v
- if ((*p).next == NULL)
# S$ s( X- q# s: P" {) i9 @ - {
# e! k9 R" n4 t& S+ V. Z - printf("为找到值为%d的结点!", x);
+ S/ q$ R2 Y! u) y) D/ |* k9 z - }4 b) j- ?+ F1 F% Q6 d3 F9 h/ a8 W
- else printf("在表中第%d位找到值为%d的结点!", j, x);3 I# h. d2 V0 z% H' }
- }* z9 @: _5 x! u2 c
- # v8 a9 {/ q; T: M k
- //在链表中按照为止查找元素/ C9 |8 {: \1 Y. S' ?3 g
- void SearchList(Linklist *head, int i)
; l O! I. m8 H. F4 k - { H6 t3 R1 f( v6 e; {& S: Q$ a
- if (i > LengthList(head) && i <= 0)
' R% Q/ b. k% U" [ - printf("位置越界!");
4 m" J: d# I# f- q( U# P - else
+ g- E1 C% n7 Z7 d O - {( K3 z- q. ~- }5 i3 E
- Linklist *p = head;
* e' z) L- U4 B4 D$ [ - for (int j = 0; j != i; ++j)
$ G# z- u2 S( M, P8 b - {
- U" e( ?/ v6 L+ ?1 x% ~ - p = (*p).next;
( ?; C" b- T, z3 [8 f8 J3 I0 H - }
) s0 H8 H! ^9 t, u - printf("在%d位上的元素值为%d。", i, (*p).data);; y& V8 T+ ]+ N/ J2 N1 I$ ~2 N
- }
% M; p* @. G- f; i8 O - 5 ?* p, D i1 ?8 V. k
- }
1 j& M& K9 U# r3 V: ?; j5 \8 f0 u
8 s d1 Y: e; F9 H1 c# @- //判断链表是否为空表
+ |, `) }$ J x( ^0 U - bool isLinklistNULL(Linklist *head)
* V s* m1 ?7 C! D3 a; s# f: M7 [ - {
5 u3 Q1 h7 O5 C" J) d - return (*head).next != NULL ? true: false;6 X0 O% D4 I) X: r$ Z1 T) S3 J
- ( C( X! t7 e B: ]+ H
- }4 F: v: J7 K6 `, n
- //按位置查入元素
- @5 O( O$ z( X8 H/ R6 t/ Y& X - void InsList(Linklist *head, int i, DataType x)
; ~! @# O# z8 k2 C2 f - {7 R* e, W9 d; T$ M4 j7 j" ?' `
- int j = 0;
# h+ o0 L9 s& ` i: O! j0 b% a: _' b - Linklist *p, *s;
1 D: H9 U% A( L0 R/ G - p = head;* ?7 W: A# \ J
- while ((*p).next != NULL&&j < i - 1)
+ Y0 }3 J7 z! |1 F0 X( _. X7 K - {$ a3 I$ |7 w1 c" F+ l
- p = (*p).next;5 Y0 v# v, {+ }( R, `" ^" S; j
- ++j;3 w0 n+ f0 r3 j6 b
- }
) t$ {* { n g, h `1 m8 s - if (p != NULL)1 i3 h+ x" U/ p) n! }
- {
$ n, L3 ^ J& G5 `* O7 D. } - s = (Linklist*)malloc(sizeof(Linklist));
. y' V) m/ Z u D - (*s).data = x;
9 u4 J* F/ I, b1 k7 U7 b6 I - (*s).next = (*p).next;7 V! K {- u+ J
- (*p).next = s;# f2 `' T9 L) U+ j7 c4 S2 @- s/ a; d0 X
- printf("插入元素成功!");2 u" ?0 C8 p( }( |% t# `+ v
- }
" W6 \% s9 k* N; ]; D - else printf("插入元素失败!");9 O; f6 z. [% ?6 _
- }9 {: ~3 G& J, }) D
* V& f1 i& G4 z' S5 ]5 `! b7 ?- //按位置删除元素
$ K. q/ b3 g+ \2 y& j D! _ - void DelList(Linklist *head, int i)7 A( [# M( j- G! E, E+ U1 s
- {; |: }0 z" r: \. q3 z' r5 c$ K
- int j = 0;# O5 B, U) C! T* y% l6 L! T! i" c
- DataType x;3 Y: ` j( p- P0 r
- Linklist *s, *p = head;5 ~% r0 g- S; h5 A
- while ((*p).next != NULL&&j < i - 1)2 j c, `3 c* x- O+ l
- {
+ Z" ]; u6 A" y# ?* U - p = (*p).next;7 K- j' [; O0 S. P5 N- g" U
- ++j;/ d k" Q. _; [' R* `7 o% N( m
- }& X: c# E5 L7 @ a# L9 f- z- P
- if ((*p).next != NULL&&j == i-1)4 t3 D+ b( a4 i+ v8 V
- {
- p! I9 H" y3 n0 z - s = (*p).next;% r7 V2 k; j$ U( D) G
- x = (*s).data;
9 i" e- O. F6 M. D# ? - (*p).next = (*s).next;. D2 Z8 {4 {2 e# Y
- free(s);# [+ j. f* V. H! G
- printf("删除第%d位上的元素%d成功!", i, x);* E; A. P$ n% {+ d. D& f! F% j
- }1 N# p, x$ _- z3 t+ I
- else printf("删除操作失败!");. i. E! @ x) l/ F p. g9 D/ s
- }
3 }; a/ v* H1 S - void DispList(Linklist *head)
0 L1 R- H. V* x: V+ Z4 a7 r - {
* ~( m" V5 Q& \ ~' {8 W$ z6 N - Linklist *p = (*head).next; e7 e- }* s* u" x$ D+ K
- while (p != NULL)( r+ u5 Z# W/ m& J7 X+ Y- t
- {
, @, V, M: ]+ _( A - printf("%3d", (*p).data);: \1 G( X }7 L. R& Z8 F* b* Q: M
- p = (*p).next;
+ f& m* q# d& c- _/ ~) V; J - }0 X: c! m7 U X0 W+ W0 E3 ]
- }) p8 z: ?* _( N* O
- //显示链表7 |2 W3 C2 e- z- Z, O2 e0 a
; c' \) L! A; R) o" {4 X3 B- 5 E, Z" h: B3 V# a+ O7 y
- //菜单显示: e' b' \; R5 c% d- O4 t9 \
- void MenuLine()
- F/ `" |4 _- i - {
6 O6 ^0 J7 \8 m - printf("\t\t线性表子系统 ");9 K% l7 `; Q! X4 g
- printf("\n==================================\n");! m; {* l* {& j
- printf("\n| 1--建立 |\n");2 D0 [# w. @# I# h3 o8 e
- printf("\n| 2--插入 |\n");" w, ?4 p/ R4 \5 K/ I3 p$ p* l
- printf("\n| 3--删除 |\n");
( A# R* L1 |, T6 m1 O' h0 E/ [ P% E l - printf("\n| 4--按位置查找 |\n");
- h: t6 b' T, c2 {' _ - printf("\n| 5--按元素值查找 |\n");, p2 n4 I g# ?, u, M
- printf("\n| 6--求表长 |\n");
7 d9 m O$ K% T; O: W7 m$ ^0 T$ B - printf("\n| 7--是否为空表 |\n"); A. I" B+ }3 ^0 K/ c7 F
- printf("\n| 0--退出 |\n");
2 \- A! l4 T3 a0 m) X P4 i - printf("\n请输入菜单号:");
5 ? E* U; h& }5 H/ j8 Q3 S - 7 _* w$ l! r4 q& e% y* V. ?
- }- M2 I7 ~% l/ y! Z' c1 t
- int main()5 A- K6 v' P# x! ?
- {* A: u& A' V+ u* x5 j
- Linklist *head;
+ s7 \- J; g' u3 ^5 R# R9 h2 J2 w - DataType x;
3 G3 _$ d, s( V L: S, t9 k L - int i, n;
. E: d- j. m6 e( O1 G# r. u6 `5 u - char ch1='y', ch2,a;8 n1 A; j& Q9 T6 a0 f
- & f% d, k4 F- w4 ^
- while (ch1 == 'y' || ch1== 'Y'): F% Y/ V8 I) s8 R6 W( g
- {
) l& Y8 ]" J0 z& v6 ~0 s - MenuLine();! M' t! k/ t: G; ^2 ~ W6 u3 k# ], H
- scanf("%c", &ch2);' [' `4 t! j5 r, @1 H. {
- getchar();
- e3 _2 h- U8 i* c4 S: Z - switch (ch2)
1 R9 y4 a6 i, H4 _1 s8 m - {2 U6 Q8 |4 Z9 F- S; x! M n
- case '1':) [: p1 H) Z: s3 i. S& S- r5 l* c
- head = InitLinklist();6 }$ [3 E1 c$ d- u; ], ?0 Q$ R2 X+ @ I
- printf("请输入要建立线性表的长度:");
( B, y8 E) v" { - scanf("%d",&n);# w* N0 W) V- n/ ?8 `
- getchar();
8 w: m; z/ s2 e6 y. {. @1 s - CreateLinklistL(head,n);- b2 N- f0 }8 H2 J1 }/ r: q
- getchar();
7 B/ d/ }! B3 B6 B2 F - printf("建立后的线性表为:\n");: B5 N: \' S% q- j( d: [
- DispList(head);
+ _1 @ }$ G& ] - break;* S& L' f2 z: F7 u0 D& u
- case '2':7 J5 u8 T6 _4 T
- printf("请输入要插入元素的位置:");
a, d; P( _) m) J) ? - scanf("%d",&i);+ O5 K. D( `' @% n1 s
- getchar();
% u3 @7 W y/ J0 y+ j" t; o! C+ U - printf("请输入要插入元素的值:");( d) O/ k/ D$ h6 I! e
- scanf("%d",&x);7 Y3 D5 p+ ]- z1 S( }, d7 w5 P
- getchar();
% b- R& ]4 J, z& G4 x. U - InsList(head,i,x);
! L" K: q( L: `- `: h% Z7 B - printf("插入以后的线性表为:\n");7 i9 p! S: B% ?5 A; m' y
- DispList(head);) U0 N, _; [3 i4 C% v" n/ }& r( n; H
- break;
' B; m4 m2 M: y7 _6 t9 n - case '3':
+ n, x0 Q |! R: \. G5 | - printf("请输入要删除的元素位置:");
) U; Y, W. ~! o' V2 j - scanf("%d", &i);) a( o" y+ E0 C$ y
- getchar();
( D. h3 V e! u - DelList(head,i);
6 I( u( a; u1 o2 x' Y, t1 f% x - printf("删除以后的线性表为:\n");
/ o3 A5 g& [( ~! X+ W8 X, r - DispList(head);$ ` A$ E0 _5 F$ k X( M
- break;/ d% D" w# p" e( V, P L
- case '4':: K7 L: W% @$ ^! l* w, i6 N* F8 Y
- printf("请输入要查找元素的位置:");1 }+ @7 H; K0 `4 @
- scanf("%d", &i);
3 R% g0 B, h2 n/ P) I8 P* K8 z - getchar();! U/ K& Q* Z; q) |0 a W& Q& l7 }( F
- SearchList(head, i);
' C# B! g/ b- H - break;( O0 p6 O5 I) K; u
- case '5':1 E! x+ u& Q5 `( M6 i7 i6 V! f
- printf("请输入要查找的整数:");
, Y1 R2 ]6 }6 n, C3 c; T0 K* l - scanf("%d", &x);
- A- v$ e( k; `. C9 M! a" p4 G. a - getchar();* U% w \7 N/ v3 W+ }* F
- Locate(head,x);
' q n$ z, I8 b3 B' I6 q - break;
* p2 w# B5 f; f0 G: k: g6 s - case '6':
+ A# |6 X. F4 m) o - printf("该线性表的长度为%d!",LengthList(head));! B( [9 g4 u( |' T9 Y& h
- break;/ n- u- `; V7 R
- case '7':! w, o7 t9 Q3 J A# b+ |8 L
- if (isLinklistNULL(head)) printf("不是空表"); else printf("是空表"); break;1 m1 V% v* {; z' E
- case '0':
& h, H& x) q3 y/ O9 l) P$ [) U" x - ch1 = 'n';
: p/ l; N5 X& K) X o% r* a# i - break;
7 ], Z) p( J W9 `7 w& M5 \ - default:printf("输入有误,请重新输入!");
0 ]" l7 N) {0 ?6 Q X! k8 V0 D* s' J+ x -
! U( q- j& \( t9 U: Z4 U6 ? - }' K0 X) U9 Y" J" h
- if (ch2 != '0')
A' t$ c; f* R/ S - {2 I1 s9 a! E W1 k8 H; Q8 n" F
- printf("\n按回车继续操作,按任意键加回车结束程序!\n");: {5 J" _8 |7 r/ G
- a=getchar();! }- W% W0 V X9 F
- if (a != '\xA')5 E: b. h$ Z# x* F* W- _9 s- K$ Z
- {4 { k; ]( F3 s# |; p" w
- getchar();- ?3 w" Y2 T( B0 K/ w
- ch1 = 'n';2 d9 r. W, E% M3 B
- }
: Q- j& W4 L3 f0 d) z& \0 T - } u$ J: N5 m% f) c$ @. U
- }/ B/ n& {( k' P4 Q! \& Y0 T, k
- o) H+ q5 T4 q* r+ v7 Z1 a-
* N* j5 q5 @3 {5 r, W# n -
3 \& s, `; ?: Q5 Q8 n6 Z m - ; N% J4 v' o' L1 s% x' W
- return 0;
3 n" @( d9 R% E$ o - }
复制代码 |
|