链表操作-创建、输出、删除,添加节点
来源:互联网 发布:java arraylist排序 编辑:程序博客网 时间:2024/06/02 06:19
/*=============================================================
目的:动态链表的综合操作
算法分析: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;
}
- 链表操作-创建、输出、删除,添加节点
- 链表中的添加节点和删除节点的操作
- 动态链表的创建,输出,删除,添加
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- 单链表创建,删除节点,添加节点,排序
- java实现创建链表以及插入节点,查找结点,删除节点等操作
- Zookeeper客户端基本操作java实现——创建连接、创建节点、添加修改节点内容、获取子节点、获取节点数据、删除节点
- js操作dom节点,创建,复制,删除,添加,查找等操作总结
- 删除链表中的重复节点、剩余节点逆序输出
- 删除链表中的重复节点、剩余节点逆序输出
- 删除链表中的重复节点、剩余节点逆序输出
- js节点属性的创建 添加 删除
- js节点属性的创建 添加 删除
- ZooKeeper_Java操作(创建节点/获取节点/删除节点)
- 合并两个排序的链表及简单链表的一些操作(添加节点、删除节点)
- 链表创建添加删除
- 双向链表创建、删除某节点
- js操作之动态添加,删除节点
- The Kalman Filter
- 使用存储过程代替自定义函数计算CP95
- 读取磁盘内容
- 又一個跨平台遊戲開發工具?Game Closure 體驗
- 超好学习网站:http://dreamrunner.org/wiki/public_html/index.html
- 链表操作-创建、输出、删除,添加节点
- linux下最大文件描述符的限制
- SQL中内连接和外连接
- 【记】设计模式的相关内容
- SQL SERVER 2005 数据库状态为“可疑”的解决方法
- Oralce 博文链接
- 杂感日记20130415
- 虚拟内存与页面缓存
- C# 检查代码圈复杂度和warning规则