登录  | 立即注册

游客您好!登录后享受更多精彩

查看: 870|回复: 0

[C,C++教程] 【C语言】单链表

[复制链接]

444

主题

509

帖子

2051

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2051

荣誉管理论坛元老

发表于 2021-6-30 22:56:48 来自手机 | 显示全部楼层 |阅读模式 来自:
  1. #include <stdio.h>: s7 U/ e+ L2 |) X/ t; @4 y# @
  2. #include <malloc.h>4 O$ V8 q, s1 t
  3. #include <stdbool.h>6 U! F) m4 ^7 P- q9 D1 F$ V
  4. typedef int DataType;
    % q' q6 n& d, |4 P  ?. E
  5. typedef struct  linknode
    : ^2 {0 n0 J$ t* u
  6. {$ P/ Q. q: Q8 i7 e" F8 K
  7.         DataType data;
      F7 f+ W; x; ~; }% q
  8.         struct linknode *next;//deference
    7 J" o4 A$ U$ `& R. M5 q2 Q4 Q

  9. - X9 |% u3 V% v5 `! Z
  10. }Linklist;' \' f; W9 d# i7 ~
  11. //初始化链表
    + _; ]- c# {! v( |7 P# s4 T
  12. Linklist * InitLinklist(); e  `# ^( S. W7 o5 a1 @+ a" W
  13. {; ^: ^2 _& H& F0 T, u$ g
  14.         Linklist *head; //定义一个结点类型的指针head
    6 V+ _/ f7 Z: K/ j: r
  15.         head = (Linklist*)malloc(sizeof(Linklist));//为head动态分配空间# }8 o8 E1 A# X9 }. G* o5 E5 K5 J
  16.         (*head).data = NULL;//让head的next(指针域为NULL)6 _  n. t5 D/ _% ?
  17.         return head;0 b! ^* Z. r* ]7 x

  18. 1 \* {& L( o2 ?. F1 u
  19. }
    2 |4 L8 B( o  _" M$ L* [
  20. //头插法存放数据
    4 |- e0 g. o0 d5 l2 r+ W/ E/ j
  21. void CreateLinklistH(Linklist *head, int n), }0 t0 m' D3 O# @( i/ W
  22. {
      q7 D! ]5 }7 ?' F+ v
  23.         Linklist *s;! F3 T+ w- n0 r- U
  24.         printf("请输入%d个整数:", n);: b- b2 U' l; ?' b5 _0 r
  25.         for (int i = 0; i != n; ++i)2 @6 V8 L  O- R/ S2 q
  26.         {0 n. _( a2 M: p" s1 K( T
  27.                 s = (Linklist *)malloc(sizeof(Linklist));$ f; l/ B7 n; _$ ~9 F, _
  28.                 scanf("%d", &((*s).data));
    ) O7 h2 a6 s2 A: G  J2 _3 o0 F
  29.                 (*s).next = (*head).next;+ _7 S4 X/ }- @: Z  a, q  i/ \
  30.                 (*head).next = s;5 X/ h6 R- V8 A% F3 P
  31.         }4 F4 x5 J1 W) \4 A+ f
  32.         printf("创建链表操作成功");
    $ G# B5 n& D+ {
  33. }0 w9 v+ L4 B1 k( L- o
  34. //尾插法创建链表8 `5 U$ P& l! Z7 n- L! d
  35. void CreateLinklistL(Linklist *head, int n)
    % X# k( N+ p, ?8 R: @1 I
  36. {2 G4 ?+ v+ ~- F$ ]6 A
  37.         Linklist *s, *last;% k9 K, m1 u$ P* U
  38.         last = head;) R$ b5 k9 X: P+ i
  39.         printf("请输入%d个整数:", n);
    3 [0 u% K* N! ]( `; U
  40.         for (int i = 0; i != n; ++i)
    " T" G- g- Y  A  t* \
  41.         {8 |9 s! }; h( o
  42.                 s = (Linklist*)malloc(sizeof(Linklist));
    2 l5 R# @' S& W. ^( d$ Q% e# \
  43.                 scanf("%d", &((*s).data));
    $ @& V7 O; u  M0 M1 `* q5 v) e/ j
  44.                 (*last).next = s;
    6 X4 A$ C- ], @* h5 d& \1 I
  45.                 (*s).next = NULL;0 F9 [6 B+ a6 \4 s! m4 S% n
  46.                 last = s;1 X* y0 p* w3 T/ X5 Z5 Y1 t3 X

  47. . z5 \7 F* O" n* E( [0 [- g
  48.         }8 Z2 Q( R7 {6 p1 J) Z* G. m5 N5 ~0 W
  49.         printf("建立链表操作成功!");5 ^! d. J$ V2 C  ?
  50. }+ G5 y; p$ M: A. s
  51. //链表长度8 q" }% H4 d0 }( K3 B! x
  52. int LengthList(Linklist *head)' `+ a- [* ^. x/ ^9 k' C: ^
  53. {
    ) g+ J+ O% a3 N2 |
  54.         int i;0 B2 X+ ?5 |! o$ |9 v; R1 x
  55.         Linklist *p = head;
    ; v' u+ }$ F, ^3 Z
  56.         for (i = 0; (*p).next != NULL; ++i)" Y8 ^8 K, J* f# U0 @+ h4 U# I
  57.         {
    5 j9 S) V* i% {8 u9 z
  58.                 p = (*p).next;7 v5 m! a& \5 W2 b$ w
  59.         }( q' r% z  c1 N
  60.         return i;# ^) s; H- A- U) V: I+ C# {1 v" H
  61. }+ e2 a6 |% |2 q, f( O, J
  62. //查找位置
    1 |; w: A% T+ r" I' G
  63. void Locate(Linklist *head, DataType x); v" V) r9 i( b  u# l4 `) k
  64. {" ]4 j& N/ r" N* j& Q
  65.         int j = 1;
    ; j$ e9 d: j5 t* S2 E1 m* v
  66.         Linklist *p = (*head).next;
    " X( }+ f( }$ E. z9 q! T* s* j
  67.         while ((*p).next != NULL && (*p).data != x)/ s7 B+ a4 l7 ^: q) K
  68.         {4 [# z  z2 b& i+ [5 \
  69.                 p = (*p).next;& c' V/ b9 h6 E+ w
  70.                 ++j;8 K& r7 Q4 r& O) \1 ?" `
  71.         }9 O- z$ f/ }0 N' O! v
  72.         if ((*p).next == NULL)
    # S$ s( X- q# s: P" {) i9 @
  73.         {
    # e! k9 R" n4 t& S+ V. Z
  74.                 printf("为找到值为%d的结点!", x);
    + S/ q$ R2 Y! u) y) D/ |* k9 z
  75.         }4 b) j- ?+ F1 F% Q6 d3 F9 h/ a8 W
  76.         else printf("在表中第%d位找到值为%d的结点!", j, x);3 I# h. d2 V0 z% H' }
  77. }* z9 @: _5 x! u2 c
  78. # v8 a9 {/ q; T: M  k
  79. //在链表中按照为止查找元素/ C9 |8 {: \1 Y. S' ?3 g
  80. void SearchList(Linklist *head, int i)
    ; l  O! I. m8 H. F4 k
  81. {  H6 t3 R1 f( v6 e; {& S: Q$ a
  82.         if (i > LengthList(head) && i <= 0)
    ' R% Q/ b. k% U" [
  83.                 printf("位置越界!");
    4 m" J: d# I# f- q( U# P
  84.         else
    + g- E1 C% n7 Z7 d  O
  85.         {( K3 z- q. ~- }5 i3 E
  86.                 Linklist *p = head;
    * e' z) L- U4 B4 D$ [
  87.                 for (int j = 0; j != i; ++j)
    $ G# z- u2 S( M, P8 b
  88.                 {
    - U" e( ?/ v6 L+ ?1 x% ~
  89.                         p = (*p).next;
    ( ?; C" b- T, z3 [8 f8 J3 I0 H
  90.                 }
    ) s0 H8 H! ^9 t, u
  91.                 printf("在%d位上的元素值为%d。", i, (*p).data);; y& V8 T+ ]+ N/ J2 N1 I$ ~2 N
  92.         }
    % M; p* @. G- f; i8 O
  93. 5 ?* p, D  i1 ?8 V. k
  94. }
    1 j& M& K9 U# r3 V: ?; j5 \8 f0 u

  95. 8 s  d1 Y: e; F9 H1 c# @
  96. //判断链表是否为空表
    + |, `) }$ J  x( ^0 U
  97. bool isLinklistNULL(Linklist *head)
    * V  s* m1 ?7 C! D3 a; s# f: M7 [
  98. {
    5 u3 Q1 h7 O5 C" J) d
  99.         return (*head).next != NULL ? true: false;6 X0 O% D4 I) X: r$ Z1 T) S3 J
  100. ( C( X! t7 e  B: ]+ H
  101. }4 F: v: J7 K6 `, n
  102. //按位置查入元素
    - @5 O( O$ z( X8 H/ R6 t/ Y& X
  103. void InsList(Linklist *head, int i, DataType x)
    ; ~! @# O# z8 k2 C2 f
  104. {7 R* e, W9 d; T$ M4 j7 j" ?' `
  105.         int j = 0;
    # h+ o0 L9 s& `  i: O! j0 b% a: _' b
  106.         Linklist *p, *s;
    1 D: H9 U% A( L0 R/ G
  107.         p = head;* ?7 W: A# \  J
  108.         while ((*p).next != NULL&&j < i - 1)
    + Y0 }3 J7 z! |1 F0 X( _. X7 K
  109.         {$ a3 I$ |7 w1 c" F+ l
  110.                 p = (*p).next;5 Y0 v# v, {+ }( R, `" ^" S; j
  111.                 ++j;3 w0 n+ f0 r3 j6 b
  112.         }
    ) t$ {* {  n  g, h  `1 m8 s
  113.         if (p != NULL)1 i3 h+ x" U/ p) n! }
  114.         {
    $ n, L3 ^  J& G5 `* O7 D. }
  115.                 s = (Linklist*)malloc(sizeof(Linklist));
    . y' V) m/ Z  u  D
  116.                 (*s).data = x;
    9 u4 J* F/ I, b1 k7 U7 b6 I
  117.                 (*s).next = (*p).next;7 V! K  {- u+ J
  118.                 (*p).next = s;# f2 `' T9 L) U+ j7 c4 S2 @- s/ a; d0 X
  119.                 printf("插入元素成功!");2 u" ?0 C8 p( }( |% t# `+ v
  120.         }
    " W6 \% s9 k* N; ]; D
  121.         else printf("插入元素失败!");9 O; f6 z. [% ?6 _
  122. }9 {: ~3 G& J, }) D

  123. * V& f1 i& G4 z' S5 ]5 `! b7 ?
  124. //按位置删除元素
    $ K. q/ b3 g+ \2 y& j  D! _
  125. void DelList(Linklist *head, int i)7 A( [# M( j- G! E, E+ U1 s
  126. {; |: }0 z" r: \. q3 z' r5 c$ K
  127.         int j = 0;# O5 B, U) C! T* y% l6 L! T! i" c
  128.         DataType x;3 Y: `  j( p- P0 r
  129.         Linklist *s, *p = head;5 ~% r0 g- S; h5 A
  130.         while ((*p).next != NULL&&j < i - 1)2 j  c, `3 c* x- O+ l
  131.         {
    + Z" ]; u6 A" y# ?* U
  132.                 p = (*p).next;7 K- j' [; O0 S. P5 N- g" U
  133.                 ++j;/ d  k" Q. _; [' R* `7 o% N( m
  134.         }& X: c# E5 L7 @  a# L9 f- z- P
  135.         if ((*p).next != NULL&&j == i-1)4 t3 D+ b( a4 i+ v8 V
  136.         {
    - p! I9 H" y3 n0 z
  137.                 s = (*p).next;% r7 V2 k; j$ U( D) G
  138.                 x = (*s).data;
    9 i" e- O. F6 M. D# ?
  139.                 (*p).next = (*s).next;. D2 Z8 {4 {2 e# Y
  140.                 free(s);# [+ j. f* V. H! G
  141.                 printf("删除第%d位上的元素%d成功!", i, x);* E; A. P$ n% {+ d. D& f! F% j
  142.         }1 N# p, x$ _- z3 t+ I
  143.         else printf("删除操作失败!");. i. E! @  x) l/ F  p. g9 D/ s
  144. }
    3 }; a/ v* H1 S
  145. void DispList(Linklist *head)
    0 L1 R- H. V* x: V+ Z4 a7 r
  146. {
    * ~( m" V5 Q& \  ~' {8 W$ z6 N
  147.         Linklist *p = (*head).next;  e7 e- }* s* u" x$ D+ K
  148.         while (p != NULL)( r+ u5 Z# W/ m& J7 X+ Y- t
  149.         {
    , @, V, M: ]+ _( A
  150.                 printf("%3d", (*p).data);: \1 G( X  }7 L. R& Z8 F* b* Q: M
  151.                 p = (*p).next;
    + f& m* q# d& c- _/ ~) V; J
  152.         }0 X: c! m7 U  X0 W+ W0 E3 ]
  153. }) p8 z: ?* _( N* O
  154. //显示链表7 |2 W3 C2 e- z- Z, O2 e0 a

  155. ; c' \) L! A; R) o" {4 X3 B
  156. 5 E, Z" h: B3 V# a+ O7 y
  157. //菜单显示: e' b' \; R5 c% d- O4 t9 \
  158. void MenuLine()
    - F/ `" |4 _- i
  159. {
    6 O6 ^0 J7 \8 m
  160.         printf("\t\t线性表子系统   ");9 K% l7 `; Q! X4 g
  161.         printf("\n==================================\n");! m; {* l* {& j
  162.         printf("\n|             1--建立             |\n");2 D0 [# w. @# I# h3 o8 e
  163.         printf("\n|             2--插入             |\n");" w, ?4 p/ R4 \5 K/ I3 p$ p* l
  164.         printf("\n|             3--删除             |\n");
    ( A# R* L1 |, T6 m1 O' h0 E/ [  P% E  l
  165.         printf("\n|             4--按位置查找       |\n");
    - h: t6 b' T, c2 {' _
  166.         printf("\n|             5--按元素值查找     |\n");, p2 n4 I  g# ?, u, M
  167.         printf("\n|             6--求表长           |\n");
    7 d9 m  O$ K% T; O: W7 m$ ^0 T$ B
  168.         printf("\n|             7--是否为空表       |\n");  A. I" B+ }3 ^0 K/ c7 F
  169.         printf("\n|             0--退出             |\n");
    2 \- A! l4 T3 a0 m) X  P4 i
  170.         printf("\n请输入菜单号:");
    5 ?  E* U; h& }5 H/ j8 Q3 S
  171.         7 _* w$ l! r4 q& e% y* V. ?
  172. }- M2 I7 ~% l/ y! Z' c1 t
  173. int main()5 A- K6 v' P# x! ?
  174. {* A: u& A' V+ u* x5 j
  175.         Linklist *head;
    + s7 \- J; g' u3 ^5 R# R9 h2 J2 w
  176.         DataType x;
    3 G3 _$ d, s( V  L: S, t9 k  L
  177.         int i, n;
    . E: d- j. m6 e( O1 G# r. u6 `5 u
  178.         char ch1='y', ch2,a;8 n1 A; j& Q9 T6 a0 f
  179.         & f% d, k4 F- w4 ^
  180.         while (ch1 == 'y' || ch1== 'Y'): F% Y/ V8 I) s8 R6 W( g
  181.         {
    ) l& Y8 ]" J0 z& v6 ~0 s
  182.                 MenuLine();! M' t! k/ t: G; ^2 ~  W6 u3 k# ], H
  183.                 scanf("%c", &ch2);' [' `4 t! j5 r, @1 H. {
  184.                 getchar();
    - e3 _2 h- U8 i* c4 S: Z
  185.                 switch (ch2)
    1 R9 y4 a6 i, H4 _1 s8 m
  186.                 {2 U6 Q8 |4 Z9 F- S; x! M  n
  187.                 case '1':) [: p1 H) Z: s3 i. S& S- r5 l* c
  188.                         head = InitLinklist();6 }$ [3 E1 c$ d- u; ], ?0 Q$ R2 X+ @  I
  189.                         printf("请输入要建立线性表的长度:");
    ( B, y8 E) v" {
  190.                         scanf("%d",&n);# w* N0 W) V- n/ ?8 `
  191.    getchar();
    8 w: m; z/ s2 e6 y. {. @1 s
  192.                         CreateLinklistL(head,n);- b2 N- f0 }8 H2 J1 }/ r: q
  193.    getchar();
    7 B/ d/ }! B3 B6 B2 F
  194.                         printf("建立后的线性表为:\n");: B5 N: \' S% q- j( d: [
  195.                         DispList(head);
    + _1 @  }$ G& ]
  196.                         break;* S& L' f2 z: F7 u0 D& u
  197.                 case '2':7 J5 u8 T6 _4 T
  198.                         printf("请输入要插入元素的位置:");
      a, d; P( _) m) J) ?
  199.                         scanf("%d",&i);+ O5 K. D( `' @% n1 s
  200.                         getchar();
    % u3 @7 W  y/ J0 y+ j" t; o! C+ U
  201.                         printf("请输入要插入元素的值:");( d) O/ k/ D$ h6 I! e
  202.                         scanf("%d",&x);7 Y3 D5 p+ ]- z1 S( }, d7 w5 P
  203.    getchar();
    % b- R& ]4 J, z& G4 x. U
  204.                         InsList(head,i,x);
    ! L" K: q( L: `- `: h% Z7 B
  205.                         printf("插入以后的线性表为:\n");7 i9 p! S: B% ?5 A; m' y
  206.                         DispList(head);) U0 N, _; [3 i4 C% v" n/ }& r( n; H
  207.                         break;
    ' B; m4 m2 M: y7 _6 t9 n
  208.                 case '3':
    + n, x0 Q  |! R: \. G5 |
  209.                         printf("请输入要删除的元素位置:");
    ) U; Y, W. ~! o' V2 j
  210.                         scanf("%d", &i);) a( o" y+ E0 C$ y
  211.    getchar();
    ( D. h3 V  e! u
  212.                         DelList(head,i);
    6 I( u( a; u1 o2 x' Y, t1 f% x
  213.                         printf("删除以后的线性表为:\n");
    / o3 A5 g& [( ~! X+ W8 X, r
  214.                         DispList(head);$ `  A$ E0 _5 F$ k  X( M
  215.                         break;/ d% D" w# p" e( V, P  L
  216.                 case '4':: K7 L: W% @$ ^! l* w, i6 N* F8 Y
  217.                         printf("请输入要查找元素的位置:");1 }+ @7 H; K0 `4 @
  218.                         scanf("%d", &i);
    3 R% g0 B, h2 n/ P) I8 P* K8 z
  219.    getchar();! U/ K& Q* Z; q) |0 a  W& Q& l7 }( F
  220.                         SearchList(head, i);
    ' C# B! g/ b- H
  221.                         break;( O0 p6 O5 I) K; u
  222.                 case '5':1 E! x+ u& Q5 `( M6 i7 i6 V! f
  223.                         printf("请输入要查找的整数:");
    , Y1 R2 ]6 }6 n, C3 c; T0 K* l
  224.                         scanf("%d", &x);
    - A- v$ e( k; `. C9 M! a" p4 G. a
  225.    getchar();* U% w  \7 N/ v3 W+ }* F
  226.                         Locate(head,x);
    ' q  n$ z, I8 b3 B' I6 q
  227.                         break;
    * p2 w# B5 f; f0 G: k: g6 s
  228.                 case '6':
    + A# |6 X. F4 m) o
  229.                         printf("该线性表的长度为%d!",LengthList(head));! B( [9 g4 u( |' T9 Y& h
  230.                         break;/ n- u- `; V7 R
  231.                 case '7':! w, o7 t9 Q3 J  A# b+ |8 L
  232.                         if (isLinklistNULL(head)) printf("不是空表"); else printf("是空表"); break;1 m1 V% v* {; z' E
  233.                 case '0':
    & h, H& x) q3 y/ O9 l) P$ [) U" x
  234.                         ch1 = 'n';
    : p/ l; N5 X& K) X  o% r* a# i
  235.                         break;
    7 ], Z) p( J  W9 `7 w& M5 \
  236.                 default:printf("输入有误,请重新输入!");
    0 ]" l7 N) {0 ?6 Q  X! k8 V0 D* s' J+ x
  237.                
    ! U( q- j& \( t9 U: Z4 U6 ?
  238.                 }' K0 X) U9 Y" J" h
  239.                 if (ch2 != '0')
      A' t$ c; f* R/ S
  240.                 {2 I1 s9 a! E  W1 k8 H; Q8 n" F
  241.                         printf("\n按回车继续操作,按任意键加回车结束程序!\n");: {5 J" _8 |7 r/ G
  242.                         a=getchar();! }- W% W0 V  X9 F
  243.                         if (a != '\xA')5 E: b. h$ Z# x* F* W- _9 s- K$ Z
  244.                         {4 {  k; ]( F3 s# |; p" w
  245.                                 getchar();- ?3 w" Y2 T( B0 K/ w
  246.                                 ch1 = 'n';2 d9 r. W, E% M3 B
  247.                         }
    : Q- j& W4 L3 f0 d) z& \0 T
  248.                 }  u$ J: N5 m% f) c$ @. U
  249.         }/ B/ n& {( k' P4 Q! \& Y0 T, k

  250. - o) H+ q5 T4 q* r+ v7 Z1 a
  251.        
    * N* j5 q5 @3 {5 r, W# n
  252.        
    3 \& s, `; ?: Q5 Q8 n6 Z  m
  253. ; N% J4 v' o' L1 s% x' W
  254.         return 0;
    3 n" @( d9 R% E$ o
  255. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|星空社区 |网站地图

GMT+8, 2024-4-27 22:04 , Processed in 0.061660 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表