链表

单向链表

1.链表

链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。

2.链表的主要内容

链表的第一个节点和最后一个节点,分别称为链表的头节点和尾节点。尾节点的特征是其 next 引用为空(null)。链表中每个节点的 next 引用都相当于一个指针,指向另一个节点,借助这些 next 引用,我们可以从链表的头节点移动到尾节点。

3.链表的分类

链表数据结构中主要包含单向链表、双向链表及循环链表。

单向链表

单向链表只有一个指针域,在整个节点中数据域用来存储数据元素,指针域用于指向下一个具有相同结构的节点。
单向链表
下面用C语言分别实现:链表的创建、输出链表、元素的插入和删除、元素的查询。

  1. 链表的创建。
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;
}

  1. 链表的输出
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);
}
}

  1. 链表的删除。
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;	
}
  1. 链表的插入。

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值