链表操作-创建、输出、删除,添加节点
2013-04-15 10:53
513 查看
/*============================================================= 目的:动态链表的综合操作 算法分析:1、构造第一个结构体作为头 2、以P2和P1为游码在结构体移动 3、 p1负责存储新创立的结构体,p2负责指向新创立的结构体 4、creat函数返回链表的头 ============================================================== 作者:最后的村长 时间:2009年12月21日 工具:DEV C++ 4.9.9.2 version:1.0 ==============================================================*/ #include <stdio.h> #include <stdlib.h> //#define NULL 0 #define LEN sizeof(struct student) struct student { long num; int score; struct student *next; };//学生结构体定义,包含两个数据:学号和成绩 int n;//n为全局变量,实现链表中元素个数的统计 struct student *create(void)//开辟动态链表函数 { struct student *head; struct student *p1,*p2; n=0; long int stu_id=1100; p1=p2=(struct student *)malloc(LEN);// p1->num=stu_id; printf("请输入1个学生的成绩:\n"); scanf("%d",&(p1->score));//第一个学生结构体创立结束 head=NULL; while(p1->score!=0) { n=n+1;//统计链表中结构体元素的个数 if(n==1)head=p1;//头指针赋值 else p2->next=p1;//前一个结构体的next指向下一个结构体 //!注意上面语句的执行顺序 p2=p1;//p2移向下一个结构体 p1=(struct student *)malloc(LEN);//新开辟一个结构体内存单元 stu_id=stu_id+2; p1->num=stu_id;//对新开辟的结构体内元素初始化 printf("请输入%d个学生的成绩:\n",n+1); printf("成绩:"); scanf("%d",&(p1->score)); } p2->next=NULL; return head; } /*=============================================================*/ void print(struct student *head) { struct student *p; printf("\n一共是 %d个学生成绩如下 :\n",n); p=head; if(head!=NULL) do { printf("%ld,%d\n",p->num,p->score); p=p->next; }while(p!=NULL); } /*=============================================================*/ struct student*del(struct student *head,long int delnum) { struct student *p1,*p2; p2=p1=head; if(head->num==delnum)//如果要删除的学生是第一个的话 { printf("删除的学生是第一个\n"); head=head->next; n--;//学生总数减一 } else//删除的学生不是第一个 { while(p1->num!=delnum)//遍历链表寻找要删除的学生 { p2=p1; p1=p1->next; } if((p1->next==NULL)&&(p1->num!=delnum))//链表中无此要删除的学生 printf("此链表中无要删除的学生\n"); else if((p1->next==NULL)&&(p1->num==delnum))//要删除的学生是最后一个 { p2->next=NULL; n--;//学生总数减一 } else if(p1->num==delnum)//要删除的学生是链表中的其中一个 { p1=p1->next; p2->next=p1; n--;//学生总数减一 } } return head; } /*=============================================================*/ struct student *insert(struct student *head,struct student *p0) { struct student *p1,*p2; p2=p1=head;//p1和p2指向头指针 if((p0->num)<(head->num))//如果插入学生的学号小于第一个学生的学号 { head=p0; p0->next=p1; } else //如果插入学生的学号大于第一个学生的学号 { while((p0->num)>(p1->num))//遍历链表对学生的的学号进行对比 { p2=p1; p1=p1->next; } printf("p1当前指向的学生的序号是:%ld,成绩是:%d,指向的下一个学生的地址是:%d\n\n",p1->num,p1->score,p1->next); if(p1->next==NULL)//链表遍历结束也没有找到比插入学生的学号大的 { p1->next=p0; p0->next=NULL; } else if((p0->num)<=(p1->num))// { p2->next=p0; p0->next=p1; } } n++; return (head); } int main() { struct student *p,*head; //======================创建并输出链表 head=create();//创建链表 print(head);//打印创建后的链表 for(int i=0;i<10;i++) {printf("========");} puts("\n"); //===========================删除一个学生 unsigned int delnum;//定义要删除的学生号 printf("请输入要删除的学生号:\n"); scanf("%u",&delnum);//输入要删除学生号 head=del(head,delnum);//删除学生号 printf("输出删除学号:%ld的学生后的链表\n",delnum); print(head);//打印删除后的学生号 for(int i=0;i<10;i++) {printf("========");} puts("\n"); //=====================插入一个学生 struct student stu; //初始化待插入的学生的学号和成绩 puts("请输入待插入学生的学号:"); scanf("%ld",&stu.num); puts("请输入待插入学生的成绩:"); scanf("%d",&stu.score); head=insert(head,&stu); printf("输出插入学号:%ld,成绩:%d的学生后的链表\n",stu.num,stu.score); print(head); for(int i=0;i<10;i++) {printf("========");} puts("\n"); //=================== system("PAUSE"); return 0; } |
相关文章推荐
- 树的基本结构,以及利用链表实现树的各项操作(创建、添加/删除/打印树节点、销毁等等)
- 链表中的添加节点和删除节点的操作
- 设计一个整型链表类list,能够实现链表节点的插入、删除、以及链表数据的输出操作。
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- 链表的创建,输出,删除,插入操作。VS2012环境下可执行
- 带头节点链表的操作(链表的创建、删除、查找、逆转、打印等等)
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- javascript 原生方法对dom节点的操作,创建、添加、删除、替换、插入、复制、移动等操作
- 常见算法:C语言中链表的操作(创建,插入,删除,输出)
- 带有头指针的链表的 创建 输出 查找 删除 释放 排序(冒泡排序)功能实现(尾插法(自动记录最后一个节点))
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- [原]C语言实现双向链表删除节点、插入节点、双向输出等操作
- 单链表创建,删除节点,添加节点,排序
- 单向链表小练习--》创建链表头,添加删除链表节点,释放链表内存,选择插入数据
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- 合并两个排序的链表及简单链表的一些操作(添加节点、删除节点)
- 单向链表的创建、节点删除、链表输出、翻转(写法参考计蒜客数据结构课程)
- C++中链表的创建、输出、节点删除、节点插入、翻转、清空
- 完整的链表操作(定义-创建-插入-删除-输出)
- js操作dom节点,创建,复制,删除,添加,查找等操作总结