自学C语言之链表


#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

#define LEN sizeof(struct student) //student结构的大小

struct student *creat();//创建链表

struct student *del( struct student *head ,int num);	//del函数是用于删除结点,*head是链表的头指针,num是要删除的结点num。

struct student *insert( struct student *head ,struct student *stu_2);//第一个参数是需要被插入的链表 
void print(struct student *head);//打印链表							 //第二个参数是带插入的结构的地址 

struct student {
	int num;
	float score;
	struct student *next;
} ;
int n;//全局变量,用来记录存放了多少数据。


int main() {
	struct student *str,*p,stu_2;
	int n;

	str = creat();
	p = str;
	print(p);

	printf("请输入被删除的学号:\n");
	scanf("%d",&n);
	str = del(p,n); 
	print(str);

	printf("请输入要插入的学号:\n");
	scanf("%d",&stu_2.num);
	printf("Please input the score: ");
	scanf("%f",&stu_2.score);

	p = insert(str,&stu_2);
	print(p);
	
	printf("\n\n");
	system("pause");

}
struct student *insert( struct student *head ,struct student *stu_2) {
	struct student *p0,*p1,*p2;
	p1 = head;
	p0 = stu_2;
	if( NULL == head) {
		head = p0;
		p0->next = NULL;
	} else {
		while(p0->num > p1->num && (p1->next != NULL)) {
			p2 = p1;
			p1 = p1->next;
		}

		if(p0->num <= p1->num) {
			if(head == p1) {
				head = p0;
			} else {
				p2->next = p0;
			}
			p0->next = p1;
		} else {			//p0的num最大插入到尾部 
			p1->next = p0;
			p0->next = NULL;
		}
	}
	n = n+1;
	
	return head; 
}


struct student *del( struct student *head ,int num) {
	struct student *p1,*p2;
	if( head == NULL) {
		printf("这是个空链表");
		goto END;
	}
	p1 = head;
	while( p1->num!=num && p1->next!=NULL) {
		p2 = p1;
		p1 = p1->next;
	}
	if(p1->num == num) {
		if(p1 == head) {
			head = p1->next;
		} else {
			p2->next = p1->next;
		}
		printf("\nDelete No: %d succeed!\n",num);
		n = n-1;
	} else {
		printf("无法查询到需要删除的数据");
	}

END:
	return head;
}

struct student *creat() {
	struct student *head;
	struct student *p1,*p2;

	p1 = p2 = (struct student *)malloc(LEN); //LEN是student结构的大小
	printf("Please enter the num :");
	scanf("%d",&p1->num);
	printf("Please enter the score :");
	scanf("%f",&p1->score);

	head = NULL;
	n = 0;

	while(p1->num) {
		n++;
		if( 1 == n) {
			head = p1;
		} else {
			p2->next = p1;
		}

		p2 = p1;
		p1 = (struct student *)malloc(LEN);

		printf("\nPlease enter the num :");
		scanf("%d",&p1->num);
		printf("Please enter  the score :");
		scanf("%f",&p1->score);
	}
	p2->next = NULL;

	return head;
}

void print(struct student *head) {
	struct student *p;
	printf("\nThere are %d records!\n",n);

	p = head;
	if(head) {
		do {
			printf("学号为 %d 的成绩是:%f\n",p->num,p->score);
			p = p->next;
		} while(p);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值