赞
踩
链表和数组作为算法中的两个基本数据结构,在程序设计过程中经常用到。今天记录一下在几天前学习和使用链表过程中的一些知识要点。
用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来判断,个人理解的意思大概是当链表元素溢出时不再继续访问。
以上介绍了链表的部分基本操作,这些操作是实现很多算法的基础。本文章只是个人学习的笔记,希望大家共同交流分享,不足之处望指出。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。