链表的创建、添加、删除、销毁、遍历 |
您所在的位置:网站首页 › 单链表删除数据元素中的元素会消失吗为什么 › 链表的创建、添加、删除、销毁、遍历 |
单向链表的创建、添加、删除、销毁、遍历
前言一、创建链表: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 |