C语言:记录下最基础的链表学习操作:创建 删除 插入 输出。以防以后没带书回家又忘记!!

C语言链表基本操作:创建 删除 插入 输出

  1. 题目示例:输入学号、姓名、成绩(创建);留下不及格的同学也就是删除及格的同学(删除);增加一个同学的信息(插入);输出不及格的同学(输出)。
//建立学生信息成绩表,输入学号为 0 为结束标志 
// 将不及格的同学信息输出(可以将及格的同学删掉) 
#include<stdio.h>
#include<string.h>
#include<stdlib.h> 
struct student{
	int num;
	char name[20];
	int score;
	struct student *next;//此时此刻还有一点不理解为什么next指针也是结构类型 
};
struct student *Creat_Stu_Doc();//创建链表。
struct student *Delet_Doc(struct student *head); //删除及格的人 = 留下不及格的人然后输出 
struct student *Add_Doc(struct student *head,int index); //增加一个人的信息 
void Print_Stu_Doc(struct student *head);//输出最后的链表 
int main(void)
{
	struct student *head;//整个链表的头节点 
	head = Creat_Stu_Doc();
	head = Delet_Doc(head);
	
	int index;
	printf("想在第几位同学后面添加信息?(0即使开头)"); 
	index = scanf("%d",&index);
	head = Add_Doc(head,index);
	
	Print_Stu_Doc(head);
	return 0;
}
struct student *Creat_Stu_Doc()
{
	struct student *head,*tail,*p;
	int num,score;
	char name[20];
	int size = sizeof(struct student);
	head = tail = NULL;
	//开始输入,当学号为0时结束 
	scanf("%d",&num);
	while (num!=0){
		scanf("%s%d",name,&score);
		p = (struct student*)malloc(size);//给一个新的节点分配空间,返回地址
		p->num = num;
		p->score = score;
		strcpy(p->name,name); 
		p->next = NULL;
		if (head==NULL){
			head = p;//第一次进来:把第一个节点的地址给p,等下return head 
		}
		else{//除了第一个,以后的每次进来都走这个 
			tail->next = p;
		}
		tail = p;
		scanf("%d",&num);
	} 
	return head;
}

struct student *Delet_Doc(struct student *head)
{
	if(head==NULL){
		return NULL;
	}
	struct student *ptr1,*ptr2;
	//处理第一个头结点
	while(head->score>=60){
		ptr2 = head;
		head = head->next;//把头指针当到第二个 
		free(ptr2); //把及格的同学释放掉,继续进入循环,直到第一个是不及格 
	} 
	//进行到这一步时,第一个头结点肯定不及格
	ptr1 = head;//最后返回head就ok了,到现在head不会变了 
	ptr2 = head->next;
	while(ptr2!=NULL){//盘算是否是尾结点
		if (ptr2->score>=60){//删掉ptr2 
			ptr1->next = ptr2->next;//1和3相连 
			free(ptr2);
		} 
		else{
			ptr1 = ptr2;
		}
		ptr2 = ptr1->next; 
	
	} 
	return head;
	 
}

struct student *Add_Doc(struct student *head,int index){
	struct student *ptr1,*ptr2,*p;
	int size = sizeof(struct student);
	int num,score;
	char name[20];
	scanf("%d%s%d",&num,name,&score);//键盘输入数据 
	p = (struct student*)malloc(size); //开辟一个p的节点 
	p->num = num;
	p->score = score;
	strcpy(p->name,name);// 给节点传入数据 
	if(index==0){//加在开头 
		ptr2 = head;
		head = p;
		head->next = ptr2;
		return head;
	}
	else{//加在第index数之后 
		ptr1 = head;
		ptr2 = head->next;
		for(int i = 1;i<index;i++){
			ptr1 = ptr2;
			ptr2 = ptr1->next; 
		}
	//现在已经定位到第index个
	p->next = ptr1->next;
	ptr1->next = p; 
	return head;
	}
} 
 
void Print_Stu_Doc(struct student *head)
{
	struct student *tmp;
	if (head==NULL){
		printf("There is no record");
		return;
	}
	for(tmp=head;tmp;tmp = tmp->next)//划重点
	{
		printf("%d %s %d\n",tmp->num,tmp->name,tmp->score); 
	} 
	 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值