当前位置:   article > 正文

关于使用链表过程中的知识要点(新手笔记)_struct student tmp是什么意思

struct student tmp是什么意思

链表和数组作为算法中的两个基本数据结构,在程序设计过程中经常用到。今天记录一下在几天前学习和使用链表过程中的一些知识要点。
用C语言分别实现:链表的创建和初始化、遍历、元素的插入和删除。

第一,链表的创建和初始化:

struct Student						//创建结构体
{
	int score;
	struct Student *pNext;
};

struct Student* InitLink()			//创建和初始化链表
{
	int i;
	struct Student *head;			//定义三个结构体指针,使用尾插法实现链表的创建和初始化
	struct Student *new;
	struct Student *tail;
	
	head=(struct Student*)malloc(sizeof(struct Student));		//先给head分配空间
	head->score=100;											//给head的元素赋值
	head=>pNext=NULL;											//先给head的pNext等于NULL
	tail=head;													//tail的作用是让它永远指向最后一个元素,tail需要先赋值,因为下面我们即将要用到它
	
	for (i=0;i<10;i++)											//用一个for循环,创建十个链表元素
	{	
		new=(truct Student*)malloc(sizeof(struct Student));		//给new分配空间
		new->score=i;											//给新建的链表元素初始化赋值
		new->pNext=NULL;										//让新建的链表元素的pNext置空
		
		tail->pNext=new;										//此时的tail是等于head,相当于是head的pNext指向新建的链表元素,这一步完成链表的创建
		tail=new;												//再然后,tail指向新建的链表元素,以便完成下一次循环链表元素可以指向又一次新建的链表元素
	}
	return head;												//完成链表的创建和初始化之后把链表的头节点返回给主函数
}

int main()
{
	struct Student *head;										//定义一个结构体指针head
	head=InitLink();											//把初始化后的链表头返回给head
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

第二,链表的遍历访问并输出:

struct Student *p=head;											//新建一个结构体指针指向头结点
while(p!=NULL)													//判断条件,当节点不为空的时候,打印到屏幕,这样就完成了链表元素的遍历输出
{
	printf("score=%d\n",head->score);
	p=p->pNext;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

第三,链表的插入:

struct Student* AddLink(struct Student *head)		//定义一个类型为struct Student* 的函数,由主函数调用
{
	struct Student *p=head;							//由主函数传入头结点并让p指向头结点
	struct Student *add;							//新建一个结构体指针用于插入
	struct Student *tmp;
	int score;
	printf("position of adding score :\n");			//选择要插入到哪个节点位置的后面
	scanf("%d",&score);

	add=(struct Student*)malloc(sizeof(struct Student)); 	//开始初始化要插入的节点
	printf("add score:\n");
	scanf("%d",&add->score);

	while(p!=NULL && p->pNext!=NULL){						//先制定一个条件,头结点和尾节点不能删除
		if (p->score==score)								//找到要插入节点的位置
		{
			tmp=p->pNext;									//让tmp指向要插入的节点的下一个节点
			p->pNext=add;									//让节点的pNext指向要插入的节点
			add->pNext=tmp;									//让插入的节点的pNext指向被插入节点的下一个节点,这样就完成了链表的插入
			break;
		}
		p=p->pNext;											//实现循环遍历链表
	}
	return head;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

第四,链表的删除:

struct Student* DelLink(struct Student *head)	//定义一个类型为struct Student* 的函数,由主函数调用
{
	struct Student *p=head;						//由主函数传入头结点并让p指向头结点
	struct Student *tmp;						//定义一个tmp,用于删除链表元素
	int score;
	printf("delete score:\n");
	scanf("%d",&score);
	while(p!=NULL && p->pNext!=NULL){			//先制定一个条件,头结点和尾节点不能删除
		if (p->pNext->score==score)				//首先,要删除某个节点,需要找到要删除的节点的前一个节点,由前面输入的分数来判断是要删除哪一个节点
		{
			tmp=p->pNext;						//让tmp指向要删除的节点
			p->pNext=tmp->pNext;				//让前节点的pNext指向要删除的节点的pNext,这样要删除的节点就从链表中移除了,但没有完全删除
			break;
		}
		p=p->pNext;								//实现循环遍历链表
	}
	free(tmp);									//使用free语句释放要删除的节点空间,这一步就完成让节点完全删除
	return head;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

总结:
从这几天的代码编写来看,当初不是很理解遍历的条件为什么要用不等于NULL来判断,个人理解的意思大概是当链表元素溢出时不再继续访问。
以上介绍了链表的部分基本操作,这些操作是实现很多算法的基础。本文章只是个人学习的笔记,希望大家共同交流分享,不足之处望指出。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/143046?site
推荐阅读
相关标签
  

闽ICP备14008679号