你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

链表基本操作的实现

[复制链接]
巅峰残狼 发布时间:2014-12-2 17:33
本程序转自网络,特别感谢网友白光6 |$ u. g! L1 H

! x5 D) ?/ }% e- W#include <stdio.h>
4 k* ^4 u3 m# ]: }9 d  U#include <malloc.h>. t, d# B  d, l  K9 N6 o
#define LEN sizeof(struct student)5 a( }4 f8 [( ~9 t" f5 h: B
7 S# }, p% I! g/ ]' [1 y
/*----------------数据定义----------------------*/
( w% `( A) r) j( ~( A- S! o. N( S6 V6 V. x, o5 p/ {3 a2 H" a
//定义一个学生信息的结构体,包括学号,姓名和结构体类型的指针
1 [, z% w. i  V2 a' lstruct student
7 y& N6 a' q/ G( a3 W2 V7 F# @{
) B( d4 Y3 }" g& o7 E    long num;                //学号 5 z- R8 Y" H1 m/ ^
    char name[128];            //姓名 2 ~) g4 n  C6 n' C$ g$ T7 R1 G) e
    struct student *next;    //结构体指针
. I  x4 I  I0 f' w( q5 X};$ i9 g5 t4 b, V6 B. t
  y' ^' V5 E& N4 m% N- i
typedef struct student * stuNode;
$ J0 q: H. l  B, ~8 ~  `$ ~
' l3 z9 B, f2 V" F$ y8 wint n=0;                    //全局变量,记录链表的长度 ) ?. S0 ^- Q9 A, M, _7 u) U

' q. h) [- j- w  d- C" O5 @1 U" ^/*---------------函数声明---------------------*/' X, {/ L3 O! z% f# T4 h: A( J9 I

7 _5 D* X7 n# C: ]; g' c( hstuNode Create();            //创建一个新的链表                     
$ {8 x' l* A# ^. I% {- C$ D, C. q7 D/ M: P) c" u* V$ C+ A
void Print(stuNode head);    //通过传入的链表头指针打印整个链表 0 @5 x# H2 f6 _

2 m; G6 ]# \. e' d( H" NstuNode Delete(stuNode head,int num);    //通过传入的链表头指针和学生学号删除节点 1 M+ s- C7 q7 K7 E& d

5 B. S; @+ Q- N  \# estuNode Insert(stuNode head,stuNode newStu);    //依照学生学号的顺序向链表中插入新元素 ) J3 M' n2 w8 K% w

5 m2 G/ I7 R; L. L6 ]$ _  R8 T% u; ^, [' i% }0 [, O, R
/*---------------函数定义----------------------*/
$ D3 K. K) W# Y+ u" N6 S- H3 n0 w- c* s
struct student *Create(), X) n- o! _$ V% U
{8 L; |+ G- i5 F, [  y/ |2 Y+ b
    struct student *head,*p1,*p2;
. T% T, W' o& P- m5 O  [7 B+ g- J0 D5 Z  l+ {$ k
    //开辟一个LEN大小的空间,并让p1,p2指针指向它
. w; b% m- {* I3 z) N# s% S    p2=p1=(struct student *)malloc(LEN);4 @  x$ @4 q9 g" e9 s
    //将头指针置为NULL
. x2 f& R( g1 @7 I* i( V2 f) x4 g- _    head=NULL;$ o, g9 W. L* Y+ l" S6 [+ Y
/ Z2 b  t: D; y, E8 a
    //创建链表节点并给节点的元素赋值 $ ?) A' E5 t, `" a5 w
    printf("请输入学生的学号和姓名:");4 a3 ^2 s% z9 n0 G. M
    scanf("%ld %s",&p1->num,p1->name);# A7 v6 ]" z3 o* T7 g; t3 Y
    while(p1->num!=0)$ _* j% q: K/ Z4 I. f& V
    {
; p" C& F$ p* C) ~+ [8 I" e        n=n+1;
7 s" [- h! R2 f3 G4 _) U0 t        if(NULL==head)
" Z! L, W4 C5 V' p$ Y        {8 Y& L/ i2 B* Q1 P/ c: L3 l
            head=p1;
$ {* C0 [- g+ H* c0 Q        }& E- j* X  L6 F0 f
        else% J7 _1 p/ l0 `2 z( B
        {/ p0 M0 O6 o4 G/ f5 `! B
            p2->next=p1;2 T5 ~, G: g) u9 [$ a
        }
1 I; z' E. d" A  c        p2=p1;
3 y' g0 Z) @. K9 A+ C# b6 g" |        p1=(struct student *)malloc(LEN);- z) j5 n/ E) N% a, I
        printf("请输入学生的学号和姓名:");- Q, O* _" k* _$ W/ t
        scanf("%ld %s",&p1->num,p1->name);
* l9 z* Z1 f/ y. L8 k7 \4 K/ N. |6 B    }0 \6 I+ u' d( q" B3 ]
    //将尾节点的指针置为NULL
# |  r! S* N- [+ G6 s: B% O    p2->next=NULL;
$ \6 o( Z- y. o5 h  c0 A    return head;
+ c7 K. e" r) C" j0 E  m$ U}0 Z6 E9 G" i9 @  P) P
8 e& S) S9 b# |

3 O* v0 X0 e* [' u2 O2 Uvoid Print(struct student *head)
" p, H6 I/ K7 Z9 N4 E% L{
  U4 }: Y1 O+ p4 G! `9 U6 `  c    struct student * p;; E0 _. u7 j$ x8 k  U9 \
    p=head;  P3 `9 ?/ c3 T* B# T; v* V
, o1 y3 o) w7 G7 V4 C, _/ T! T: c
    //判断链表是否为空
2 Z$ Z3 V( p& T5 Z! ~    if(NULL==head); d) m! X/ K! R/ X4 V2 |9 Y
    {) w' R" a, b: x& Q% \7 b  K% u. Z3 h
        printf("链表为空!\n");
- n. l0 ~8 R4 p        return head;# D6 F: r- _% [1 x+ S5 L- Z
    }
& ~/ {1 j& ]8 v$ L4 S    else3 j9 Q- z" ~6 l6 i% Y9 ~
    {
6 ]% r4 Z8 m# g& q        //循环打印链表中的元素
+ j/ K/ x2 Q0 M        printf("%d 个记录分别为:\n",n);
5 R) j! U. v6 `( t0 r        while(p!=NULL). B) h% M; M. b  v# a2 }
        {; U/ q4 _  g! k* V5 l  x6 `8 p/ z
            printf("%ld %s\n",p->num,p->name);
, I% D& J2 |8 V6 V- R            //指针指向下一个节点 - J% r5 y, e; P  ]: t8 e
            p=p->next;
& w7 F% Q$ G# j. ?/ F        }5 E. B! z+ I5 h2 z( T
    }
4 x& L" }/ X8 F}0 Y' h- W3 \1 o# a  {& ^
! ^3 d- o2 Z8 e$ e- f8 Q5 h
1 N3 W& V; d5 K
struct student *Delete(struct student * head,int num)
: b) F; p+ i+ ~% |7 i  i: s{' e% B+ ?2 O% F& ~6 H2 n
    struct student *p1;& x6 j9 h& I! q7 M7 S, B0 b
    struct student *p2;
  G0 o! ?* e3 k2 H* M    p1=head;
, w5 w- f2 W% t7 \    //判断链表是否为空
* u7 A& D9 K9 J+ E0 [: k    if(NULL==head)
. l! ]% I$ A% n/ J$ w( k" e  G    {
( i, R" h. ?. z% P/ K6 m% u/ P$ W, ?  Y        printf("链表为空!\n");. c* ^* [2 S: _4 V: R% Z
        return head;
6 e" V- f8 b. D; `6 z    }
8 a* P- G/ ^' W& ?; H( ~    //遍历节点,判断当前节点是不是需要删除的节点及是否为尾节点) @8 }* s# i( S9 K! O2 ^( a, V
    //如果找到相应节点,或者已经遍历到尾节点就跳出循环
# S5 Z% f+ C" ~6 Q1 \, j3 R8 }# A    while(p1->num!=num&&p1->next!=NULL)
, |6 Q# _! C! o* o& x) d9 c    {. q- n+ S& K0 M. L# Q- d
        p2=p1;( r3 {3 X4 ~% u' Z. L- Y
        p1=p1->next;
; T) |& B% r: U0 }    }0 |0 |# I+ ?2 k7 _0 @
    //判断是否找到相应节点
6 U. H/ V5 w6 Y& I& J    if(p1->num==num)
+ n, b7 _3 ], h8 O2 _8 ]) Z    {
0 j3 ^* z0 y& t8 g% l        //要删除的节点是不是链表的第一个节点) d" o4 s- ?. V' ^& T" `+ c
        //如果是,就将头指针指向该节点的后一个节点
! g" O1 z$ B4 B        //如果不是,就将该节点的前一个节点的指针指向该节点的后一个节点 # M# S1 j! ^6 p/ I* W
        if(head==p1)) Q4 E& ^. t& O' u% {/ Z
        {
6 z2 \7 _* C8 o% Z6 h0 g+ w            head=p1->next;: Y) X! I; O* P
        }
) g# m, P9 _% [2 H9 v- d; y8 H' ~        else
1 Z& O% ]; H; O' ]        {( G; J! {- P1 d$ N& ]
            p2->next=p1->next;
! f' `+ x( u9 o6 Z        }
, ~/ G  N+ t2 N" T        n=n-1;
7 V  i' t7 K, }& C6 \* i2 l* c        printf("%ld 节点已删除.\n",num);/ {9 N9 \" b/ ^
    }
7 K* f! J, m; t: z    else# L8 _' K7 M3 B7 {2 y# _
    {, ~( M! w: Z7 Z' y0 t" n
        printf("链表中没有要删除的元素.\n");8 R4 Y) [2 H5 |- U, _2 @
    }
# c9 I2 ^( T: I  [9 X    return head;
" s5 l5 `! X; p  i. s}+ y9 T' |1 o. g8 y3 E4 ~! }. [; B/ i0 C
. U9 \# ?3 }  L; g0 F

/ d( q9 x8 s, n" D: Zstruct student *Insert(struct student * head,struct student * newStu)
: L, D; d, B1 Q2 d9 w{
% T" _0 m4 T) P4 L, x4 R    struct student *p0;
/ j8 m4 A$ i  R    struct student *p1;
$ b$ t8 \9 H5 i    struct student *p2;) \+ H8 v! P" d0 [, [
    p0=newStu;/ J1 b' R9 y' E* M
    p1=head;
2 m2 \1 l% U* X    //判断链表是否为空,如果是空链表,就将新节点作为第一个节点 0 k/ z& n# d( N4 b$ s! K
    if(NULL==head)/ C% s, o' I4 G$ D! ~( E
    {# _! |% a. |* [; E! X& D
        head=p0;( }2 C$ x/ c5 w9 C' a
        p0->next=NULL;0 K& W! c* E& L; Q( H" U1 H
    }
# y+ f& H/ s% v# c" Y0 f    else
) A' Z8 k  N4 X- A, H. |    {
' Q3 R( m# r' V1 \6 R8 B        //遍历每一个节点中的学号,与新学号比较大小
# n. k+ q9 g% {# R        //如果找到一个学号比新学号大,就将新学号的节点插入它之前 0 ~' l0 X* K9 y. m; U
        //如果尾节点的学号仍比新学号小,就将新节点插入到链表尾部 2 y) f$ O3 j8 `
        while((p0->num > p1->num)&&(p1->next!=NULL))
2 }  U/ l% c3 G        {
) G+ |# m9 V0 }9 P2 r            p2=p1;, Q/ Q" u% E! m8 Q* o
            p1=p1->next;
* P- ^9 G1 B2 U0 J        }7 r3 R; _5 p% ]- A- m$ U! a
        //找到一个比新学号大的节点
2 r+ D' k# m4 }; b8 Z: H2 _% U        if(p0->num <= p1->num)# K/ E" g" j  ?- [. D
        {6 V+ ~, v% l7 n# e; U- r- ^! ~1 |
            //判断该节点是否为头节点,如果是,则将新节点设置为头节点
7 [. Y% k- j$ {+ q1 ^; ~( ?            if(p1==head). y1 t3 O% D: i# y$ r0 b
            {: y1 w5 X; ]( p$ B  d  Z& S
                head=p0;* N! h# l% u( o
            }  z3 [8 c& V' O, [9 i) A
            else
% J% _8 q& K. x% J) l; b            {: E# ?. q9 {) i( e8 a* v
                p2->next=p0;
( ?1 |  r; V; _3 `            }7 k4 h# [! Y3 N, f4 e
              p0->next=p1;$ m  p# w1 ?: L9 i2 P+ s
        }
& I( s8 [& \. h& f$ C4 i        else
1 F. m. k" D' k) X" R5 T        {- `+ k" \5 J" H3 ~7 E% M$ `# s+ ?9 M5 G
            p1->next=p0;2 M  p5 y3 ]/ r) M7 _
            p0->next=NULL;" S" ~& F6 `. Y: I& I9 u
        }
( D8 p& N' c5 d1 H    }
( h# V4 y) ~6 R, T/ w) n    //链表长度加1 5 U  j& N  ^0 z; q6 N# U
    n=n+1;$ \: z+ g; w  W+ z7 |
    printf("%ld 插入成功!\n",newStu->num);
0 l& N: T4 C. H( J2 ^7 a    return head;
4 Z# W' m8 ^' k  N, J. f3 \}
2 E* }4 X7 g5 C* a" _% D( J8 ?2 X* ?, |' `0 F" f
void main()# {  M2 {- X5 L
{) z  q3 L) ^" x8 C0 L4 e
    struct student *head;4 {$ l) s% \' r* O" ~' F
    struct student *stu;& r* U% `& p" Z  V; w# z
    int num;
3 Y8 B% S! Q' i& L    head=Create();4 C+ ?7 A5 p, H! t8 Y
    Print(head);6 P" K7 W- Q1 i- |" ?. a" N
    printf("请输入要删除的学号:");( s: o) t6 B5 O
    scanf("%ld",&num);
  o. B! b# O' i" F+ c6 }- y4 D    while(num!=0)
; w& n6 U6 {3 P4 `4 B2 |    {
+ B, F! h$ Y) Y# ?' k6 V        head=Delete(head,num);
, O/ i  T! }, j# T6 X2 Y2 S5 }        Print(head);
5 D" Q' Z; h3 X9 m5 O4 f        printf("请输入要删除的学号:");" v4 x$ D, ^/ B; f5 X
        scanf("%ld",&num);
- N4 j. q- R: C& W, I    }0 s. w! G2 N6 J' b/ r* J1 V, {
    printf("请输入要插入的节点:");0 i! L6 l! B  o- D& S
    stu=(struct student *)malloc(LEN);
+ X8 {! k7 i3 v7 _1 x3 x    scanf("%ld %s",&stu->num,stu->name);) F- [, t+ ~! y
    while(stu->num!=0)
. f3 v: g# K& L# ~+ k    {% r1 V" u: ^& F1 r
        head=Insert(head,stu);/ R7 [9 \+ Z& U7 v* ?7 u
        printf("请输入要插入的节点:");
! Y, p" V' V/ H. B4 _        stu=(struct student *)malloc(LEN);
) F4 Z& y5 F$ C        scanf("%ld %s",&stu->num,stu->name);/ g8 q% g$ m: p7 A. K# a7 E
    }
" p, L% r7 s0 L$ `7 q) e5 B: [    Print(head);
) C! z! X+ k* D# a, h}
6 c! b$ W. ~$ Y: @* g0 M$ s5 H
+ z2 r8 H- J% h9 @$ L
收藏 1 评论4 发布时间:2014-12-2 17:33

举报

4个回答
霹雳之火 回答时间:2014-12-3 22:26:28
链表太常用了,顶起
沐紫 回答时间:2014-12-4 13:19:26
支持版主大大!
木易-357428 回答时间:2015-1-9 15:17:37
支持一下版主
花落成尘眼泪 回答时间:2018-11-30 13:09:22
正在学链表,帖子真心不错,要是楼主能够分享整个工程模板,那就对我们部分小白太好了

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版