C程序设计--链表--用指针处理链表

建立简单地静态链表

//用指针处理链表
//建立简单地静态链表
#include <stdio.h>
struct Stu{
	int num;
	float score;
	struct Stu *next;
};
void main(){
	struct Stu a,b,c,*p,*head;
	a.num=101;
	a.score=98.5;
	b.num=102;
	b.score=93.5;
	c.num=103;
	c.score=94.5;
	head=&a;
	a.next=&b;
	b.next=&c;
	c.next=NULL;
	p=head;
	do{
		printf("%d\t%.2f\n",p->num,p->score);
		p=p->next;
	}while(p!=NULL);   //这里的while后面要加分号

}

输出结果:

101     98.50
102     93.50
103     94.50
Press any key to continue

对于下面这一题的代码注释已经是不能再详细的了,认真阅读,多读有益~

建立动态链表

//用指针处理链表
//建立动态链表:写一个函数建立有n名学生的单向动态链表
#include <stdio.h>
#include <stdlib.h>
struct Stu{
	int num;
	float score;
	struct Stu *next;
};
int n;

struct Stu *creat(){
	struct Stu *head,*p1,*p2;//head是链表的头,p1指向一个新创建的节点,当节点为1时,让head指向p1的同时,p2也指向p1
	n=0;
	head=NULL;
	p1=p2=(struct Stu*)malloc(sizeof(struct Stu));//p1和p2指向一个新开辟的单元
	//建立了新单元写入第一个节点
	printf("请输入学号和分数:\n");
	scanf("%d%f",&p1->num,&p1->score);
	//写入了之后判断p1的num是否为0;为0时则表明不加入新节点了
	while(p1->num!=0){  //只要学号不等于0,就继续
		n++;
		if(n==1)//如果n是1,p1指向节点,并且是一个应该由head指向的新节点
			head=p1;
		else
			p2->next=p1;//如果n>1;head也指向头结点,就让p2的next指向p1
		p2=p1;//因为n=1时肯定让head先插入,直接到这一步,相当于p2和p1指向一个节点了
		p1=(struct Stu*)malloc(sizeof(struct Stu));
		//重新开辟一个节点空间,让p1指向他,这样就相当于p1指向新节点,p2在之前的最后一个节点上
		scanf("%d%f",&p1->num,&p1->score);//然后输入它,表示又有一个新的节点建立了
		//对于新建的节点要判断学号是否为0,不为0则进行插入操作
	}
	//节点建立完成,则让一直处于最后一个节点的p2指向null
	p2=NULL;
	return (head); //返回这个头结点
} 
void main(){
	struct Stu *p,*s;  //定义一个指针变量指向这个结构体
	p=creat();//creat函数返回一个指针,赋值给p
	s=p;
	while(s!=NULL){
		printf("\nnum=%d\tscore=%.2f\n",s->num,s->score);
		s=s->next;
	}

}

输出结果:

请输入学号和分数:
101 98.5
102 89.5
103 85.6
0 0

num=101 score=98.50

num=102 score=89.50

num=103 score=85.60
Press any key to continue
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值