
本程序转自网络,特别感谢网友白光( i6 g7 @7 P) u+ i" _- J3 J4 ~/ @2 z' o$ N #include <stdio.h> #include <malloc.h>& z* ~( `7 v5 P* z& W #define LEN sizeof(struct student)! T( Q) u9 }5 q* H % a" w9 b9 r0 U8 U& I /*----------------数据定义----------------------*/ 4 Z2 |+ l* x6 l& x" X: p 6 v U% ~% F7 X //定义一个学生信息的结构体,包括学号,姓名和结构体类型的指针 struct student { long num; //学号 char name[128]; //姓名 struct student *next; //结构体指针 };# X: Q+ |$ d( x0 o" h typedef struct student * stuNode;$ u I. G0 I. H8 _7 j# D - [+ i: n, u* [# K* J5 s0 o int n=0; //全局变量,记录链表的长度 /*---------------函数声明---------------------*/3 f$ l% J- Z. W4 B 7 z& {0 t3 }5 ]2 `! J6 G# P7 ` stuNode Create(); //创建一个新的链表 6 e+ n2 R+ L9 z2 C4 J2 d void Print(stuNode head); //通过传入的链表头指针打印整个链表 stuNode Delete(stuNode head,int num); //通过传入的链表头指针和学生学号删除节点 : O: }1 ^+ X3 U, T" x F2 ? stuNode Insert(stuNode head,stuNode newStu); //依照学生学号的顺序向链表中插入新元素 2 P8 _& I# K$ O2 {% p . t7 l0 H! ^) p: y8 l5 e /*---------------函数定义----------------------*/ 7 n. p- ^7 {6 T+ V% I. u7 V0 ^: a struct student *Create() {, n0 u5 a) `$ h `& ]' R* X, A struct student *head,*p1,*p2; 1 R X8 Z" W" Q3 z //开辟一个LEN大小的空间,并让p1,p2指针指向它 / L: }' v7 E8 w9 h5 u2 w2 u$ \ p2=p1=(struct student *)malloc(LEN); //将头指针置为NULL : ]4 M% o6 I; b" l/ w head=NULL; //创建链表节点并给节点的元素赋值 printf("请输入学生的学号和姓名:");; b" \0 N/ [+ w$ g scanf("%ld %s",&p1->num,p1->name); while(p1->num!=0)/ S$ O& g) e+ v4 m4 [* M# B1 Z {8 ~$ w% J$ b4 t) M n=n+1;( ]. n1 Q$ d7 g- _8 d$ K: ? if(NULL==head) { head=p1; } else {: j9 z0 t- ~! O1 F$ m' a p2->next=p1;4 M0 r: B! J L: }2 b4 b( D }/ a' E z! @3 w# G* ?' G p2=p1;1 q1 K' z6 ^ _' Q5 u8 y i/ ?4 w3 [ p1=(struct student *)malloc(LEN);9 E3 _0 S5 c" b4 H printf("请输入学生的学号和姓名:"); scanf("%ld %s",&p1->num,p1->name);* h9 k" ]: R% n3 ^ } //将尾节点的指针置为NULL p2->next=NULL;/ x; _& t7 `/ r7 e5 l return head; }* ]" F1 _% U$ j- } void Print(struct student *head) { struct student * p; p=head; 4 n8 N J0 s5 u1 a4 K4 ^* p //判断链表是否为空 if(NULL==head)& b, ?4 K& b8 U% p3 F0 A {& j' D" t# ^& u7 @2 f- v& u printf("链表为空!\n"); return head;, c2 p' ~ \! \3 _$ p$ _/ x5 R } else { //循环打印链表中的元素 printf("%d 个记录分别为:\n",n); while(p!=NULL) { printf("%ld %s\n",p->num,p->name); //指针指向下一个节点 " F0 ^0 @: V( Q. o% e3 j/ T p=p->next;' B6 E+ A, g0 V& K3 s! P6 ^ }) N, f, x6 p# O: p }8 s, D4 _3 {8 F) g! N5 B: ~ } 2 i/ h8 x3 [7 _( f& T- c9 d , B Q! Z4 s& p J/ \' _ struct student *Delete(struct student * head,int num)* o1 Y5 b0 O6 N# E, \1 f {2 e" v+ o6 {# p6 b3 X* p struct student *p1; struct student *p2; p1=head;" ^6 b/ X) K; p. |* `5 i9 d' m$ e //判断链表是否为空 if(NULL==head) { printf("链表为空!\n"); return head; } //遍历节点,判断当前节点是不是需要删除的节点及是否为尾节点5 k: p; ~7 \. m. U/ p% ]" o% x, ~ //如果找到相应节点,或者已经遍历到尾节点就跳出循环 ! T$ d! u/ ^+ s( @, @8 @- G while(p1->num!=num&&p1->next!=NULL)0 ~. A& V2 A1 L' e {9 N8 t' `: B, ]5 k p2=p1;3 q$ D7 L1 c. L4 u2 Q& j p1=p1->next;$ q1 ?4 z- S. J8 z6 R } //判断是否找到相应节点 if(p1->num==num)& j9 R- _7 v! o0 b a { //要删除的节点是不是链表的第一个节点* |0 I) @1 H7 J$ H //如果是,就将头指针指向该节点的后一个节点& e0 y# x. x$ {# ]% Y2 l; b5 g //如果不是,就将该节点的前一个节点的指针指向该节点的后一个节点 if(head==p1) { head=p1->next; } else# q3 m; D* E) \/ h# e( _ { p2->next=p1->next;* W- T9 l2 h% Z+ H } n=n-1;, y; k! Q$ Y k' g" F2 R printf("%ld 节点已删除.\n",num); }: [1 [, T, \& @& ]$ U- E else {6 s. s1 H9 M% b/ W, K: N printf("链表中没有要删除的元素.\n");" b" n. X, k0 o9 k }# a7 |) _% [1 h1 | return head;! {. t) `' x, t } O0 k7 o: e9 u1 v struct student *Insert(struct student * head,struct student * newStu). F/ W$ s" U+ `# Q* \( v { struct student *p0; struct student *p1; struct student *p2; p0=newStu;' i( n! a4 \/ b$ t p1=head;, n! r* X |$ q: T; I$ d //判断链表是否为空,如果是空链表,就将新节点作为第一个节点 if(NULL==head) {; W- I! B2 ` H* m) c$ M7 i head=p0;+ Q% O3 [9 B/ K$ E( U p0->next=NULL; }6 h& ~' E# w; _9 i! F else { //遍历每一个节点中的学号,与新学号比较大小5 Y0 s+ T l# p$ v //如果找到一个学号比新学号大,就将新学号的节点插入它之前 //如果尾节点的学号仍比新学号小,就将新节点插入到链表尾部 3 |1 u# h: l# F. N3 |- g$ ?/ V( l; L while((p0->num > p1->num)&&(p1->next!=NULL)) {0 M @) i5 u) R% {: s p2=p1; p1=p1->next; } //找到一个比新学号大的节点 if(p0->num <= p1->num)5 u. V+ E; G7 r {9 k8 J# E6 A5 `# H. l //判断该节点是否为头节点,如果是,则将新节点设置为头节点 if(p1==head)+ W; c% z6 G1 [: k7 K* J; a% x7 p {( U4 d$ I0 Y- `, b3 U head=p0;9 z" ~: r! ~8 A }5 V: n. q% b" p- v, @! z% ^ else8 }% _8 m) r) [# u2 z { p2->next=p0;+ a. k) ~- ~+ V' ]/ K+ V; s }3 U1 O9 J q6 U( @ p0->next=p1;4 ]' I- y; ?5 _# S: `1 h1 V }$ b, q: T* K! @% P9 ]1 m3 A# a else { p1->next=p0;6 f- I6 u- F1 E# P- K p0->next=NULL; }: q B3 {/ h% ^: x% t5 t } //链表长度加1 n=n+1; printf("%ld 插入成功!\n",newStu->num);$ C- s8 G A3 ~- y, G6 b$ ^# a3 M# b return head; } # I8 B9 V9 N: G2 a3 L' `6 X void main(): _" d) R" j. U: r; ~1 I+ y { struct student *head;4 @( I4 }4 a6 }0 d- j1 P2 I struct student *stu; int num; head=Create();7 F" H- A0 D3 C! {1 u' c" g Print(head);" V5 k6 G1 a7 L% l' D' R: \# e printf("请输入要删除的学号:"); scanf("%ld",&num); while(num!=0) { head=Delete(head,num);* S* v1 f( O& E% [' N Print(head);: P. U; O5 @ V% O* I& @ printf("请输入要删除的学号:");7 l% s9 p+ I: j scanf("%ld",&num); }: C3 {$ v% y/ O- e) }3 i* g printf("请输入要插入的节点:");/ v4 z4 C. e4 c stu=(struct student *)malloc(LEN); scanf("%ld %s",&stu->num,stu->name);/ p7 |$ Y$ |' U7 W0 ^- _ while(stu->num!=0) { head=Insert(head,stu);$ f8 {/ _# |( e. L" e printf("请输入要插入的节点:");0 s0 j, \$ K1 b# S# b3 k stu=(struct student *)malloc(LEN); scanf("%ld %s",&stu->num,stu->name);, I8 |$ b6 b6 j* r' |8 O5 r6 w } Print(head); } |
链表太常用了,顶起![]() |
支持版主大大! |
支持一下版主 |
正在学链表,帖子真心不错,要是楼主能够分享整个工程模板,那就对我们部分小白太好了 |