|
本程序转自网络,特别感谢网友白光0 v2 \& c/ T! _4 x * @% u# |6 S& ~# x$ x #include <stdio.h>( R( X& ]8 _& `8 S6 X0 E9 S% P Y* G #include <malloc.h>2 U8 n) Z% w2 c& }' X$ w #define LEN sizeof(struct student)7 R6 Z2 E4 Q8 N6 i! q9 d /*----------------数据定义----------------------*/ 9 X5 D5 \6 x6 ?3 Z2 @, j6 O ) A6 }) Q f" G" Y( D4 J- ] //定义一个学生信息的结构体,包括学号,姓名和结构体类型的指针 struct student0 Y$ ^$ B. s7 r( c5 g4 ~& c& Y {3 S% F- Y: x) b7 \' E/ U& S long num; //学号 char name[128]; //姓名 struct student *next; //结构体指针 };* u( o- i; z: _, i typedef struct student * stuNode;/ e$ J! T& ~0 Z J; w7 A W int n=0; //全局变量,记录链表的长度 ) Q# e' F( y5 J /*---------------函数声明---------------------*/+ N; a+ q( v+ s( V, O. s 3 E7 v) H4 `/ \5 l6 ^ stuNode Create(); //创建一个新的链表 , I, I8 q/ d* D' P! O/ v void Print(stuNode head); //通过传入的链表头指针打印整个链表 I4 V9 J; ^% f) h$ G9 F stuNode Delete(stuNode head,int num); //通过传入的链表头指针和学生学号删除节点 stuNode Insert(stuNode head,stuNode newStu); //依照学生学号的顺序向链表中插入新元素 4 C) v* _$ y2 `6 x6 \# u* [" `' _" k 9 Y$ b8 P1 z* m7 J) T0 W% ~ /*---------------函数定义----------------------*/% u, o4 ]2 |. V F5 g ; f0 F$ _/ @% t% G7 \ struct student *Create()1 e! ]3 ?# Y% b6 q5 N0 n; p { struct student *head,*p1,*p2;5 M/ i o. }) y/ d# }# V ! _' G' z9 b# I( c //开辟一个LEN大小的空间,并让p1,p2指针指向它 p2=p1=(struct student *)malloc(LEN); //将头指针置为NULL : V. f: Q# `; v& b% I head=NULL;- K: I- `: C! x$ i //创建链表节点并给节点的元素赋值 printf("请输入学生的学号和姓名:");' Y9 M0 \ g1 n, j scanf("%ld %s",&p1->num,p1->name); while(p1->num!=0)$ h1 u% Y; B3 d$ \' @0 u0 A; v, E {4 ~" r9 [- W* m6 s4 r* ~" Z n=n+1;( `: W2 O D" C S$ h+ g/ _5 _% C if(NULL==head)% o# u- P. |; ?% w/ ~ { head=p1; }( y' I3 A8 j- I, @ else { p2->next=p1; } p2=p1; p1=(struct student *)malloc(LEN);) v A& l7 z2 `+ e/ X" ]" `, @ printf("请输入学生的学号和姓名:");% n, ^% y# E" l4 T' p scanf("%ld %s",&p1->num,p1->name); }+ K# o0 `+ H* |! k9 i; k% [ //将尾节点的指针置为NULL p2->next=NULL; return head; }* c! I' Q S; K% X4 G* I+ j 9 e; E' d3 e6 G( ~! P8 Y void Print(struct student *head)$ u" y( i! C; Y8 j$ F9 ^3 N* s { d! W0 M2 p0 n2 h struct student * p; W2 ]: X- s4 k! a* J p=head; //判断链表是否为空 8 a( r& \: T+ b! V$ X% C if(NULL==head)8 x5 w" V# k: e1 V { printf("链表为空!\n"); return head; } else { //循环打印链表中的元素 2 K) }5 ]+ O# c8 L% o1 p printf("%d 个记录分别为:\n",n);8 V2 D/ W2 v p+ R: J while(p!=NULL) {2 l4 n- o) [8 r0 I9 t printf("%ld %s\n",p->num,p->name);9 x8 H! K3 i/ j5 F% o' w //指针指向下一个节点 p=p->next; } } }' [" t; @" E/ p/ u' Q* q struct student *Delete(struct student * head,int num) {# Z5 N$ B" m% I( w n) ^ struct student *p1; struct student *p2; p1=head;# |; `8 o% n: C2 [! a2 d //判断链表是否为空 ) p& S6 q% C* F, q& z if(NULL==head)4 o# Y: k e9 }# X {4 ^4 G- ]+ c* u. K$ e8 u7 u printf("链表为空!\n");) O/ T! s z* b+ } return head;( j' X7 T, N* j5 ?$ y- i- ~9 d( M } //遍历节点,判断当前节点是不是需要删除的节点及是否为尾节点 //如果找到相应节点,或者已经遍历到尾节点就跳出循环 while(p1->num!=num&&p1->next!=NULL) { p2=p1;) V: C$ x$ W; d% b% M4 H p1=p1->next; } //判断是否找到相应节点 if(p1->num==num)4 B7 K8 i6 l, h) r { //要删除的节点是不是链表的第一个节点/ I- [ {6 U" ~, n( ?- j //如果是,就将头指针指向该节点的后一个节点 //如果不是,就将该节点的前一个节点的指针指向该节点的后一个节点 if(head==p1)+ k4 ]* x, d6 j/ B- i { head=p1->next; }( @4 ^. U9 ]8 r' ?" c) B, C3 K else# L* y; I( R, W: d {3 U! {: y2 I' d: c p2->next=p1->next;, i4 p; W: k0 R }" V" G5 p) _1 [7 \* [3 M n=n-1;9 m1 r% h" S3 I6 u% t printf("%ld 节点已删除.\n",num);5 k4 Z; r/ E* k$ Y) s& l, d! j } else0 l9 e0 Z3 P- [* [# [$ U* j$ p- { {$ V7 G" ^# m" _3 e# m. } printf("链表中没有要删除的元素.\n");- R* R% t0 l$ Q/ N }% ?4 V, U5 k& Q, e& ^& N( [ return head;: A' o' e( {0 ^6 t* P$ D } : v* m$ r( ]3 i struct student *Insert(struct student * head,struct student * newStu) {4 \9 J" [# @( ]" w% Q$ ]0 V struct student *p0;& R$ y) D& e2 U- t6 Z& |4 \ struct student *p1; struct student *p2; p0=newStu; p1=head; //判断链表是否为空,如果是空链表,就将新节点作为第一个节点 if(NULL==head) {8 h4 j: A4 c# H+ J& e head=p0;$ z' j, I `- v* a8 D7 U/ g p0->next=NULL; } else) @* X; k. H% |+ O0 `: L& L {. d; E. A/ k1 f" J& S //遍历每一个节点中的学号,与新学号比较大小 //如果找到一个学号比新学号大,就将新学号的节点插入它之前 - x, P( [2 p- ]0 Z$ X7 e //如果尾节点的学号仍比新学号小,就将新节点插入到链表尾部 " e c% f* C6 u2 X: T' \% A( j while((p0->num > p1->num)&&(p1->next!=NULL))- [: q: I1 \$ R {( ^$ G0 A4 B. U, b( T2 L p2=p1; p1=p1->next;8 r% o. s3 A+ N6 k3 k! N } //找到一个比新学号大的节点 ' p$ V$ T( d5 g, B) l4 }9 b if(p0->num <= p1->num)- k$ K0 k5 p' q! ]7 b8 _" S3 A, v {" b" E3 |% ?' W+ U //判断该节点是否为头节点,如果是,则将新节点设置为头节点 if(p1==head)5 b; e6 E+ s7 |- V( }7 ?1 ` {; T& b( @" S' i; m( ^ head=p0; } else { p2->next=p0; } p0->next=p1;0 s+ n8 }$ m I% D+ m8 { } else ~ O5 ~4 ?% G0 [. t0 v% p { p1->next=p0; p0->next=NULL; }; {- P P3 M4 Q6 ^$ W } //链表长度加1 + H ^- J# @% e- |7 b9 Y n=n+1; printf("%ld 插入成功!\n",newStu->num);! A9 y) O/ c+ n m: ^ return head; } 8 |$ Z$ c$ A+ g) v% N void main()$ y5 Z, [/ a, t" g) V& K5 G { struct student *head;: R! E# J1 P# ?7 N l& }) J* V7 z struct student *stu; int num;% e# w7 @( m+ H1 ~ head=Create();- _# E, X3 l r$ V. @( c Print(head);2 z3 F5 |5 Y7 q8 e M5 i printf("请输入要删除的学号:"); scanf("%ld",&num); while(num!=0) _* C1 h3 Q6 v { head=Delete(head,num); Print(head); printf("请输入要删除的学号:"); scanf("%ld",&num);* Y- V2 P ~+ ?, O' t } printf("请输入要插入的节点:"); stu=(struct student *)malloc(LEN);9 {0 @6 i2 t1 ?4 j; A. J" C scanf("%ld %s",&stu->num,stu->name);+ V T5 L8 A; a; z( i/ y while(stu->num!=0) { head=Insert(head,stu);- w8 i- ]/ T2 F/ a) e printf("请输入要插入的节点:"); stu=(struct student *)malloc(LEN); scanf("%ld %s",&stu->num,stu->name); }( J- B/ M& v8 m. |; [# } Print(head);+ l- ~' }3 k4 S }4 T" V4 x/ k" B+ o$ l + X E" s2 ?% {" r+ r |
链表太常用了,顶起 |
| 支持版主大大! |
| 支持一下版主 |
| 正在学链表,帖子真心不错,要是楼主能够分享整个工程模板,那就对我们部分小白太好了 |
微信公众号
手机版