关于使用链表过程中的知识要点(新手笔记)

链表和数组作为算法中的两个基本数据结构,在程序设计过程中经常用到。今天记录一下在几天前学习和使用链表过程中的一些知识要点。
用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;
}

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

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

第三,链表的插入:

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;
}

第四,链表的删除:

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;
}

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值