单向链表
1.链表
链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。
2.链表的主要内容
链表的第一个节点和最后一个节点,分别称为链表的头节点和尾节点。尾节点的特征是其 next 引用为空(null)。链表中每个节点的 next 引用都相当于一个指针,指向另一个节点,借助这些 next 引用,我们可以从链表的头节点移动到尾节点。
3.链表的分类
链表数据结构中主要包含单向链表、双向链表及循环链表。
单向链表
单向链表只有一个指针域,在整个节点中数据域用来存储数据元素,指针域用于指向下一个具有相同结构的节点。
下面用C语言分别实现:链表的创建、输出链表、元素的插入和删除、元素的查询。
- 链表的创建。
struct Student *creat()
{
struct Student *p1,*p2;
struct Student *head=NULL;
p1=p2=(struct Student *)malloc(sizeof(struct Student));
printf("输入学号,输入成绩");
scanf("%d",&p1->name) ;
scanf("%d",&p1->num );
while(p1->name)
{
n++;
if(n==1)
{
head=p1;
}
else
{
p2->next=p1;
}
p2=p1;
p1=(struct Student *)malloc(sizeof(struct Student));
printf("输入学号,输入成绩");
scanf("%d",&p1->name) ;
scanf("%d",&p1->num );
}
p2->next =NULL;
return head;
}
- 链表的输出
void print(struct Student *head)
{
struct Student *p;
printf("总共有%d个学生\n",n);
p=head;
if(head)
{
do{
printf("成员%d %d\n",p->name ,p->num );
p=p->next;
}while(p);
}
}
- 链表的删除。
struct Student *del(struct Student *head,int num)
{
struct Student *p1,*p2;
if(NULL==head)
{
printf("error");
goto end;
}
p1=head;
while(p1->name!=num&&p1->next!=NULL)
{
p2=p1;
p1=p1->next ;
}
if(num==p1->name )
{ if(p1==head)
{
head=p1->next ;//不能直接且掉头,无返回值
}
else
{
p2->next =p1->next ;
}
n--;
}
else
{
printf("没有这个数\n");
}
end:
return head;
}
- 链表的插入。
struct Student *insert(struct Student *head,struct Student *stu2)
{
struct Student *p1,*p2,*p0;
p0=stu2;
p1=head;
if(NULL==head)
{ head=p0;
p0->next =NULL;
}
else
{
while((p0->name>p1->name)&&(p1->next !=NULL ))
{
p2=p1;
p1=p1->next ;
}
if(p0->name <=p1->name )
{
if(head==p1)
{
head=p0;
p0->next =p1;
}
else
{
p2->next =p0;
p0->next =p1;
}
}
else{
p1->next =p0;
p0->next =NULL;
}
}
n++;
return head;
}
注:主函数
#include<stdio.h>
void print();
struct Student *creat();
struct Student *del(struct Student *head,int num);
struct Student *insert(struct Student *head,struct Student *stu2);
struct Student
{
int name;
int num;
struct Student *next;
};
int n=0;
int main()
{
struct Student *stu,*p,stu2;
stu=creat();
p=stu;
print(p);
printf("输入你要删除的人的学号");
int num;
scanf("%d",&num);
print(del(p,num));
printf("输入你要插入的学号与成绩:");
scanf("%d",&stu2.name );
scanf("%d",&stu2.num );
p=insert(stu,&stu2);
print(p);
return 0;
}