单链表的访问:
只要我有头指针head,就可以通过其成员next继而找到下一个结点,以此类推可以访问所有的结点。
所谓的访问可以理解为取各个结点数据域的值进行一系列的操作,输出单向链表各个结点的数据域是最简单的访问链表的操作。
将链表中各个结点数据一次输出的步骤主要如下:
(1),找到链表的头指针
(2),若链表非空,则输出结点的成员值。否则退出
(3),寻找下一个结点
(4),转到步骤2
例子:编写函数print,顺序输出存放学生信息的单向链表各个结点数据域中的内容。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//定义结构体
struct node
{
int id;
char name[20];
int score;
struct node*next;
};
typedef struct node SNODE;
//主函数
int main()
{
SNODE *creat(SNODE *head); //函数声明
void print(SNODE *head);
SNODE *head; //定义头指针
head=NULL; //建立一个空链表
head=creat(head); //创建
print(head); //调用函数输出链表
return 0;
}
SNODE *creat(SNODE *head)
{
int id;
char name[20];
int score;
SNODE *r;
SNODE *s;
head=(SNODE*)malloc(sizeof(SNODE));
r=head; //找到主函数创建的链表的头指针
printf("输入学号");
scanf("%d",&id);
while(id!=0)
{
printf("输入姓名");
scanf("%s",name);
printf("输入成绩");
scanf("%d",&score);
s=(SNODE*)malloc(sizeof(SNODE)); //申请新的结点
//将数据存放在新的节点中
{
s->id=id;
strcpy(s->name,name);
s->score=score;
r->next=s;
}
//指针移动
r=s;
//输入下一个数据
printf("输入学号");
scanf("%d",&id);
}
r->next='0';
return head;
}
//输出链表函数
void print(SNODE *head)
{
SNODE *p;
p=head->next; //p指向头节点后的第一个结点
if(p=='0')
print("这是个空链表");
else
{
printf("学生信息为\n");
do
{
printf("%d %s %d",p->id,p->name,p->score);
p=p->next;
}while(p!=NULL);
printf("end\n");
}
}
说明:main函数中用指针head来调用print函数,也就是将一个已经建立好了的链表的头指针传递给print函数在print函数中就可以从head出发通过next域找到各个结点。
链表的插入: