
本程序转自网络,特别感谢网友白光6 |$ u. g! L1 H #include <stdio.h> #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 /*----------------数据定义----------------------*/ . N( S6 V6 V. x, o5 p/ {3 a2 H" a //定义一个学生信息的结构体,包括学号,姓名和结构体类型的指针 struct student { 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; //结构体指针 };$ i9 g5 t4 b, V6 B. t y' ^' V5 E& N4 m% N- i typedef struct student * stuNode; int n=0; //全局变量,记录链表的长度 ) ?. S0 ^- Q9 A, M, _7 u) U /*---------------函数声明---------------------*/' X, {/ L3 O! z% f# T4 h: A( J9 I stuNode Create(); //创建一个新的链表 $ D, C. q7 D/ M: P) c" u* V$ C+ A void Print(stuNode head); //通过传入的链表头指针打印整个链表 0 @5 x# H2 f6 _ stuNode Delete(stuNode head,int num); //通过传入的链表头指针和学生学号删除节点 1 M+ s- C7 q7 K7 E& d stuNode Insert(stuNode head,stuNode newStu); //依照学生学号的顺序向链表中插入新元素 ) J3 M' n2 w8 K% w 8 T% u; ^, [' i% }0 [, O, R /*---------------函数定义----------------------*/ - 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; + g- J0 D5 Z l+ {$ k //开辟一个LEN大小的空间,并让p1,p2指针指向它 p2=p1=(struct student *)malloc(LEN);4 @ x$ @4 q9 g" e9 s //将头指针置为NULL 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 { n=n+1; if(NULL==head) {8 Y& L/ i2 B* Q1 P/ c: L3 l head=p1; }& 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 } p2=p1; 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); }0 \6 I+ u' d( q" B3 ] //将尾节点的指针置为NULL p2->next=NULL; return head; }0 Z6 E9 G" i9 @ P) P 8 e& S) S9 b# | void Print(struct student *head) { 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 //判断链表是否为空 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"); return head;# D6 F: r- _% [1 x+ S5 L- Z } else3 j9 Q- z" ~6 l6 i% Y9 ~ { //循环打印链表中的元素 printf("%d 个记录分别为:\n",n); 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); //指针指向下一个节点 - J% r5 y, e; P ]: t8 e p=p->next; }5 E. B! z+ I5 h2 z( T } }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) {' e% B+ ?2 O% F& ~6 H2 n struct student *p1;& x6 j9 h& I! q7 M7 S, B0 b struct student *p2; p1=head; //判断链表是否为空 if(NULL==head) { printf("链表为空!\n");. c* ^* [2 S: _4 V: R% Z return head; } //遍历节点,判断当前节点是不是需要删除的节点及是否为尾节点) @8 }* s# i( S9 K! O2 ^( a, V //如果找到相应节点,或者已经遍历到尾节点就跳出循环 while(p1->num!=num&&p1->next!=NULL) {. q- n+ S& K0 M. L# Q- d p2=p1;( r3 {3 X4 ~% u' Z. L- Y p1=p1->next; }0 |0 |# I+ ?2 k7 _0 @ //判断是否找到相应节点 if(p1->num==num) { //要删除的节点是不是链表的第一个节点) d" o4 s- ?. V' ^& T" `+ c //如果是,就将头指针指向该节点的后一个节点 //如果不是,就将该节点的前一个节点的指针指向该节点的后一个节点 # M# S1 j! ^6 p/ I* W if(head==p1)) Q4 E& ^. t& O' u% {/ Z { head=p1->next;: Y) X! I; O* P } else {( G; J! {- P1 d$ N& ] p2->next=p1->next; } n=n-1; printf("%ld 节点已删除.\n",num);/ {9 N9 \" b/ ^ } else# L8 _' K7 M3 B7 {2 y# _ {, ~( M! w: Z7 Z' y0 t" n printf("链表中没有要删除的元素.\n");8 R4 Y) [2 H5 |- U, _2 @ } return head; }+ y9 T' |1 o. g8 y3 E4 ~! }. [; B/ i0 C . U9 \# ?3 } L; g0 F struct student *Insert(struct student * head,struct student * newStu) { struct student *p0; struct student *p1; struct student *p2;) \+ H8 v! P" d0 [, [ p0=newStu;/ J1 b' R9 y' E* M p1=head; //判断链表是否为空,如果是空链表,就将新节点作为第一个节点 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 } else { //遍历每一个节点中的学号,与新学号比较大小 //如果找到一个学号比新学号大,就将新学号的节点插入它之前 0 ~' l0 X* K9 y. m; U //如果尾节点的学号仍比新学号小,就将新节点插入到链表尾部 2 y) f$ O3 j8 ` while((p0->num > p1->num)&&(p1->next!=NULL)) { p2=p1;, Q/ Q" u% E! m8 Q* o p1=p1->next; }7 r3 R; _5 p% ]- A- m$ U! a //找到一个比新学号大的节点 if(p0->num <= p1->num)# K/ E" g" j ?- [. D {6 V+ ~, v% l7 n# e; U- r- ^! ~1 | //判断该节点是否为头节点,如果是,则将新节点设置为头节点 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 {: E# ?. q9 {) i( e8 a* v p2->next=p0; }7 k4 h# [! Y3 N, f4 e p0->next=p1;$ m p# w1 ?: L9 i2 P+ s } else {- `+ 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 } } //链表长度加1 5 U j& N ^0 z; q6 N# U n=n+1;$ \: z+ g; w W+ z7 | printf("%ld 插入成功!\n",newStu->num); return head; } " _% 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; 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); while(num!=0) { head=Delete(head,num); Print(head); printf("请输入要删除的学号:");" v4 x$ D, ^/ B; f5 X scanf("%ld",&num); }0 s. w! G2 N6 J' b/ r* J1 V, { printf("请输入要插入的节点:");0 i! L6 l! B o- D& S stu=(struct student *)malloc(LEN); scanf("%ld %s",&stu->num,stu->name);) F- [, t+ ~! y while(stu->num!=0) {% r1 V" u: ^& F1 r head=Insert(head,stu);/ R7 [9 \+ Z& U7 v* ?7 u printf("请输入要插入的节点:"); stu=(struct student *)malloc(LEN); scanf("%ld %s",&stu->num,stu->name);/ g8 q% g$ m: p7 A. K# a7 E } Print(head); } |
链表太常用了,顶起![]() |
支持版主大大! |
支持一下版主 |
正在学链表,帖子真心不错,要是楼主能够分享整个工程模板,那就对我们部分小白太好了 |