链表的创建、添加、删除、销毁、遍历

您所在的位置:网站首页 单链表删除数据元素中的元素会消失吗为什么 链表的创建、添加、删除、销毁、遍历

链表的创建、添加、删除、销毁、遍历

2024-07-12 08:57| 来源: 网络整理| 查看: 265

单向链表的创建、添加、删除、销毁、遍历 前言一、创建链表:1.链表增加节点2.链表添加元素 二、链表其他操作1.查找2.查找是否存在3.修改4.插入5.删除6.销毁7.打印 三、完整代码注意 基本没碰过链表,也没手写过,尝试一次

前言

单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指向列表中的下一个结点; 链表是由结点构成,head指针指向第一个成为表头结点,而终止于最后一个指向NULL的指针。

一、创建链表:

首先,要明确,往空链表和非空链表中添加元素的操作是不一样的,为什么呢? 因为头结点的前一个指针是头指针,而非头结点的前一个指针是前一个节点的next指针。 在空链表,只有一个头指针head,添加元素的话,需要将新申请的地址给head,也就是语句 Create_List(head,data); 而在非空链表中,需要先找到尾节点p,再把新申请的地址给p->next,也就是语句 Create_Liste(p->next,data); 结构的不同导致我们往其中添加元素的时候也必须区分。

1.链表增加节点 void Create_List(Node* &t,int data) { t=new Node; t->data=data; t->next=NULL; } 2.链表添加元素

链表添加节点:

void Add_List(Node* &head,int data)//增加 { if (head==NULL)//特判空链表的情况 { Create_List(head,data); return; } Node* p=head; //尾节点p while (p->next!=NULL) p=p->next;//把新申请的地址给p->next Create_List(p->next,data); }

代码中,寻找最后一个节点的代码是:while (p->next!=NULL) p=p->next; 这里要和遍历链表的操作区分,遍历链表的判断条件是 p!=NULL.

还需要注意,因为添加节点,需要进行修改操作,所以传入的是引用,那么在找尾指针的时候,需要另外定义一个遍历用的指针p,不能直接用head遍历。

二、链表其他操作 1.查找

查找链表中的第K个节点 : 查找到直接返回该节点的元素,否则返回0

int GetElem_List(Node* t,int k) { int sum=1; while (t!=NULL) { if (sum==k) { return t->data; } t=t->next; sum++; } return 0; } 2.查找是否存在

查找链表中该元素是否存在:

Node* Find_List(Node* t,int k) { while (t!=NULL) { if (t->data==k) return t; t=t->next; } return NULL;//未找到 } 3.修改

将第K个数改为X 布尔型返回值 修改成功则返回1,否则返回0 便于判断是否修改成功

bool Change_List(Node* t,int k,int x) { int sum=1; while (t!=NULL) { if (sum==k) { t->data=x; return 1; } t=t->next; sum++; } return 0; } 4.插入

在第K个位置插入X

void Insert_List(Node* t,int k,int x) { int sum=1; Node* target=new Node; Node* temp; target->data=x; while (t!=NULL) { if (sum==k-1) { temp=t->next; t->next=target; target->next=temp; } t=t->next; sum++; } } 5.删除

删除K位置的元素

void Delete_List(Node* t,int k)//删除K这个值 { Node* temp,*now; while(t!=NULL) { now=t;//记录现在的节点,我的链表头指针没使用数据域,因此可以从头指针后一个节点开始查询 temp=t->next; //查询当前节点指向下一个节点的值 if (temp->data==k) { now->next=temp->next; delete(temp); return; //加return 只删除一个 不加全部删除 } t=t->next; } } 6.销毁

将链表销毁清空

void Destroy_List(Node* &t)//销毁 { while (t!=NULL) { Node* temp=t; t=t->next; delete temp; } } 7.打印

简单的遍历一次

void Print(Node* t) { while (t!=NULL)//&&t->next!=NULL { coutnext;//把新申请的地址给p->next Create_List(p->next,data); } int GetElem_List(Node* t,int k)//查找第k个数 { int sum=1; while (t!=NULL) { if (sum==k) { return t->data; } t=t->next; sum++; } return 0; } Node* Find_List(Node* t,int k)//查找K是否存在 { while (t!=NULL) { if (t->data==k) return t;//找到就返回 t=t->next; } return NULL;//未找到 } bool Change_List(Node* t,int k,int x)//将第K个数改为X { int sum=1; while (t!=NULL) { if (sum==k) { t->data=x; return 1; } t=t->next; sum++; } return 0; } void Insert_List(Node* t,int k,int x)//在第K个位置插入X { int sum=1; Node* target=new Node; Node* temp; target->data=x; while (t!=NULL) { if (sum==k-1) { temp=t->next; t->next=target; target->next=temp; } t=t->next; sum++; } } void Destroy_List(Node* &t)//销毁 { while (t!=NULL) { Node* temp=t; t=t->next; delete temp; } } /* void Destroy_List(Node* t) { Node* temp; while(t->next!=NULL) { temp=t->next; t->next=temp->next; delete(temp); } } */ void Delete_List(Node* t,int k)//删除K这个值 { Node* temp,*now; while(t!=NULL) { now=t;//记录现在的节点,我的链表头指针没使用数据域,因此可以从头指针后一个节点开始查询 temp=t->next; //查询当前节点指向下一个节点的值 if (temp->data==k) { now->next=temp->next; delete(temp); return; //加return 只删除一个 不加全部删除 } t=t->next; } } void Print(Node* t) { while (t!=NULL)//&&t->next!=NULL { cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3