建立简单地静态链表
//用指针处理链表
//建立简单地静态链表
#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