计算机基础知识:单链表的删除操作

合集下载

C语言之单链表的插入、删除与查找

C语言之单链表的插入、删除与查找

C语⾔之单链表的插⼊、删除与查找单链表是⼀种链式存取的数据结构,⽤⼀组地址任意的存储单元存放线性表中的数据元素。

要实现对单链表中节点的插⼊、删除与查找的功能,就要先进⾏的单链表的初始化、创建和遍历,进⽽实现各功能,以下是对单链表节点的插⼊、删除、查找功能的具体实现:#include<stdio.h>#include<stdlib.h>#include<string.h>typedef int ElemType;/***链表通⽤类型*ElemType 代表⾃定义的数据类型*struct Node *next 代表结构体指针(指向下⼀个结构体,完成链表动作)*/typedef struct Node{ElemType data;struct Node *next;}Node;/*==========单链表的初始化================*//**头结点指针数据域设置为空*/void initList(Node **pNode){*pNode=NULL;}/*===========单链表的创建=================*//**功能实现:通过⽤户不断输⼊数据,创建链表*利⽤游标俩个指针(p1,p2),将申请下的数据块(存⼊⽤户输⼊数据),链接起来*/Node *create(Node *pHead){Node *p1;Node *p2;p1=p2=(Node *)malloc(sizeof(Node)); //申请内存空间memset(p1,0,sizeof(Node)); //存⼊数据域清空scanf("%d",&p1->data);p1->next=NULL;while(p1->data>0){ //输⼊负数结束if(pHead==NULL)pHead=p1;elsep2->next=p1;p2=p1;p1=(Node *)malloc(sizeof(Node));memset(p1,0,sizeof(Node));scanf("%d",&p1->data);p1->next=NULL;}return pHead;}/*=================链表的遍历==================*//***从头结点开始,不断遍历出数据域的内容将表遍历*/void printList(Node *pHead){if(NULL==pHead)printf("链表为空\n");else{while(pHead!=NULL){printf("%d ",pHead->data);pHead=pHead->next;}}printf("\n");}/*===============插⼊节点==================*//***Node **pNode 传⼊头结点空间地址*int i 传⼊要插⼊的结点位置*/void insert_data(Node **pNode,int i){Node *temp;Node *target;Node *p;int item;int j=1;printf("输⼊要插⼊的节点值:");scanf("%d",&item);target=*pNode;for(;j<i-1;target=target->next,++j); //不断移动target位置,到要插⼊结点位置,temp=(Node *)malloc(sizeof(Node)); //申请内存空间temp->data=item; //存⼊要存⼊的数据位置p=target->next;target->next=temp;temp->next=p;}/*===============删除节点====================*//***删除结点后,释放内存空间free(temp)*/void delete_data(Node **pNode,int i){Node *target;Node *temp;int j=1;target=*pNode;for(;j<i-1;target=target->next,++j);temp=target->next;target->next=temp->next;free(temp);}/*===============查找结点====================*/int search_data(Node *pNode,int elem){Node *target;int i=1;for(target=pNode;target->data!=elem && target->next!=NULL;++i,target=target->next); if(target->next==NULL)return 0;elsereturn i;}int main(){int i;Node *pHead=NULL;initList(&pHead);pHead=create(pHead);printList(pHead);printf("输⼊插⼊节点位置\n");scanf("%d",&i);insert_data(&pHead,i);printList(pHead);printf("输⼊删除节点位置\n");scanf("%d",&i);delete_data(&pHead,i);printList(pHead);printf("输⼊查找节点\n");scanf("%d",&i);printf("节点所在位置:%d",search_data(pHead,i));return 0;}通过以上各功能的实现,希望对⼤家单链表的学习有所帮助。

单链表中插入、删除操作的算法描述

单链表中插入、删除操作的算法描述

算法描述 | 单链表中插入、删除操作1. 前言单链表是一种常见的数据结构,它由节点组成,每个节点包含数据和指向下一个节点的指针。

在实际应用中,我们经常需要对单链表进行插入和删除操作,以维护和操作数据。

本文将以深度和广度的方式,探讨单链表中插入、删除操作的算法描述,帮助读者全面理解并掌握这一重要的数据结构操作。

2. 单链表的基本结构单链表由多个节点组成,每个节点包含两部分:数据和指向下一个节点的指针。

我们来看一下单链表的基本结构:```pythonclass Node:def __init__(self, data):self.data = dataself.next = None```在上述代码中,我们定义了一个节点类Node,每个节点包含数据部分data和指向下一个节点的指针部分next。

这样的设计使得单链表能够灵活地扩展和操作,便于插入和删除操作的实现。

3. 插入操作的算法描述在单链表中进行插入操作时,我们需要考虑插入位置和插入的数据。

下面,我们分别讨论在头部、中间和尾部插入节点的算法描述。

3.1 在头部插入节点在单链表的头部插入节点是一种常见操作,可以通过以下算法描述实现:```pythondef insert_at_head(self, data):new_node = Node(data)new_node.next = self.headself.head = new_node```在上述代码中,我们首先创建一个新的节点new_node,然后将新节点的指针指向当前头结点的位置,最后将新节点设置为头结点,完成了在头部插入节点的操作。

3.2 在中间插入节点在单链表的中间位置插入节点需要先找到插入位置,然后进行插入操作。

下面是算法描述:```pythondef insert_after(self, prev_node, data):if prev_node is None:print("The given previous node must be in the linked list")returnnew_node = Node(data)new_node.next = prev_node.nextprev_node.next = new_node```在上述代码中,我们首先检查给定的前一个节点prev_node是否存在,然后创建一个新的节点new_node,并将新节点的指针指向prev_node的下一个节点,最后将prev_node的指针指向新节点,完成了在中间插入节点的操作。

《数据结构》-链表的删除

《数据结构》-链表的删除

head
头结点
p
第i-1个结点
第i个结点


图2-17 查找第i-1个结点
03
3.1 链表的删除
2
②如果第i-1个结点 未找到或第i个结点 不存在,返回0,否 则,转向③。
3
head
③使r指向第i个结点(被删除的结点),转
向④。如图2-18。
r
头结点
p 第i-1个结点

第i个结点
第i+1个结点

图2-18 r指向第i个结点
2020
数据结构
Data structure
链表的删除
讲授:xxx
02
3.1 链表的删除
要求:
删除当前单链表的第i个结点,删除成功返回1,否则返回0。可将链表头指针和删除位置i作为 参数。
算法思路:
从开始结点出发,顺着链查找第i-1个结点,将第i个结点删除。
1 算法步骤: ①定义移动指针p和工作指针r,从开始结点出发,顺着链查找第i-1个结点, 使p指向第i-1个结点,转向②。如图2-17 。
④将第i个结点从链表中摘下,释放被删除结点的空间,返 回1。如图2-19。
head
头结点
p

第结点
4
第i+1个结点

图2-19 摘下并释放空间
04
3.1 链表的删除
具体算法:
int DeleteList(LinkList head,int i)
{//链表的删除
ListNode *p,*r;
p=GetNode(head,i-1); //找到第i-1个结点
if(!p ||!p->next) //!p与p==NULL等价,!p-

c语言数据结构之单链表的插入和删除操作

c语言数据结构之单链表的插入和删除操作

c语⾔数据结构之单链表的插⼊和删除操作1,定义⼀个单链表基础定义先了解⼀下:struct LNode{ //定义单链表结点类型ElemType data; //每个节点存放⼀个数据元素struct LNode *next; //指针指向下⼀个节点}LNode,*LinkList;/*struct LNode *p=(struct LNode*)malloc(sizeof(struct LNode)); //增加⼀个新的结点,在内存中申请⼀个结点所需的空间,并⽤指针p 指向这个结点*/LNode *GetElem(LinkList L,int i){int j=1;LNode *p=L->next;if(i==0)return L;if(i<1)return NULL;while(p!=NULL&&j<i){p=p->next;j++;}return p;}上述代码*LNode GetElem(LinkList L,int i)中需要注意的是:若强调这是⼀个单链表,使⽤ LinkList;若强调这是⼀个结点,则使⽤LNode *。

1,不带头结点的单链表struct LNode{ //定义单链表结点类型ElemType data; //每个节点存放⼀个数据元素struct LNode *next; //指针指向下⼀个节点}LNode,*LinkList;bool InitList(LinkList &L){ //初始化⼀个单链表L=NULL; //空表,防⽌脏数据return true;}void test(){LinkList L; //声明⼀个指向单链表的指针//初始化⼀个空表InitList(L);//.....}2,带头结点的单链表struct LNode{ //定义单链表结点类型ElemType data; //每个节点存放⼀个数据元素struct LNode *next; //指针指向下⼀个节点}LNode,*LinkList;//初始化⼀个单链表bool InitList(LinkList &L){L=(LNode *)malloc(sizeof(LNode)); //分配⼀个头结点if(L==NULL) //内存不⾜,分配失败return false;L->next=NULL; //头结点之后暂时还没有结点return true;}//判断单链表是否为空(带头结点)bool Empty(LinkList L){if(L-next==NULL)return true;elsereturn false;}void test(){LinkList L; //声明⼀个指向单链表的指针//初始化⼀个空表InitList(L);//.....2,单链表的基本操作1,插⼊1,按位序插⼊(ListInsert(&L,i,e))在第i 个位置插⼊元素e (带头结点)bool ListInsert(LinkList &L,int i,ElemType e){if(i<1)return false;LNode *p; //指针p 指向当前扫描到的节点int j=0; //当前p指向的是第⼏个结点p=L; //L指向头结点,头结点是第0 个结点(不存数据)while(p!=NULL&&j<i-1){ //循环找到第i-1个结点p=p->next;j++;}if(p==NULL) //i 值不合法return false;LNode *s=(LNode *)malloc(sizeof(LNode));s->data=e;s->next=p->next;p->next=s; //将结点s 连到p 之后return true; //插⼊成功}不带头结点的:(不存在 “第0个“ 结点)实现代码如下:bool ListInsert(LinkList &L,int i,ElemType e){if(i<1)return false;if(i==1){ //插⼊第1个结点的操作与其他结点操作不同LNode *s=(LNode *)malloc(sizeof(LNode));s->data=e;s->next=L;L=s; //头指针指向新结点return true;}LNode *p; //指针p指向当前扫描到的节点int j=1; //当前p 指向的是第⼏个结点p=L; //p指向第1个结点(注意:不是头结点)while(p!=NULL&&j<i-1){ //循环找到第i-1个结点p=p->next;j++;}if(p==NULL) //i 值不合法return false;LNode *s=(LNode *)malloc(sizeof(LNode));s->data=e;s->next=p->next;p->next=s; //将结点s 连到p 之后return true; //插⼊成功}2,指定结点的后插操作(InsertNextNode(LNode *p,ElemType e)在p 结点之后插⼊元素e :bool InsertNextNode(LNode *p,ElemType e){if(p==NULL)return false;LNode *s=(LNode *)malloc(sizeof(LNode));if(s==NULL) //内存分配失败return false;s->data=e; //⽤结点s保存数据元素es->next=p->next;p->next=s;}3,指定结点的前插操作在p 结点之前插⼊**元素e **:bool InsertPrioNode(LNode *p,ElemType e){if(p==NULL)return false;LNode *s=(LNode *)malloc(sizeof(LNode));if(s==NULL) //内存分配失败return false;s->next=p->next;p->next=s; //新结点s 连接到p 之后s->data=p->data; //将p 中元素复制到s 中p->data=e; //p 中元素覆盖为ereturn true;}结合下图在体会⼀下:下⾯再看⼀下在p 结点之前插⼊**结点s **:bool InsertPrioNode(LNode *p,ElemType e){if(p==NULL||s==NULL)return false;s->next=p->next;p->next=s; //s 连接到p 之后ElemType temp=p->data; //交换数据域部分p->data=s->data;s->data=temp;return true;}这招偷天换⽇结合下图好好体会⼀下:2,删除1,按位序删除(带头结点)删除表L 中第i 个位置的元素,并⽤e 返回删除元素的值。

单链表删除结点

单链表删除结点

单链表删除结点单链表删除结点删除第⼀次出现的给定键值让我们制定问题陈述以了解删除过程。

给定⼀个“键值”,删除该键在链表中的第⼀个匹配项。

要从链表中删除结点,我们需要执⾏以下步骤。

1. 查找待删除的结点的前驱结点2. 更改前驱结点的指针域3. 释放⽬标结点所占内存void deleteNode(Node** head_ref, int key) /* 可能会改变头指针(⽬标结点是头结点) */{Node* temp = *head_ref; /* 保存头指针,待会⼉遍历⽤ */Node* prev = NULL; /* 保存前驱结点 */if (temp != NULL && temp->data == key) /* 如果链表⾮空且头结点正好是待删除结点, */{*head_ref = temp->next; // 更新headdelete temp; // 释放旧headreturn;}else /* 链表⾮空且⽬标结点不是头结点 */{while (temp != NULL && temp->data != key) /* 查找满⾜条件的第⼀个结点,直⾄查找成功或者temp出界(指向null) */{prev = temp; /* 当前结点存到前驱结点中 */temp = temp->next; /* 当前结点向后顺移,遍历结束时,prev是末尾结点,temp是末尾结点->next,即null */}if (temp == NULL) // 两种情况下到达这⾥:链表⼀开始就是空的。

或者经过上⾯的循环,链表已遍历完毕,此时temp指向链表外部的null,说明直到查找结束仍未找到满⾜key的结点,任务失败 */ return;// Unlink the node from linked list. unlink 解开链条,很⽣动prev->next = temp->next; /* 让前驱结点不再指向待删除结点,⽽是指向待删除结点的后继结点,即孤⽴⽬标结点 */delete temp; /* 释放内存 */}}/* 函数调⽤ */deleteNode(&head, 1);删除指定位置结点Example:Input: position = 1, Linked List = 8->2->3->1->7Output: Linked List = 8->3->1->7Input: position = 0, Linked List = 8->2->3->1->7Output: Linked List = 2->3->1->7如果待删除的结点是头结点,正常删除就⾏。

单链表操作之删除

单链表操作之删除

单链表操作之删除⼀、从开始处删除从开始处删除,通常可以假设结构中⾄少有⼀个节点。

这个操作返回删除项。

其形式如下:# coding: utf-8class Node(object):def __init__(self, data, next=None):self.data = dataself.next = nexthead = Nonefor count in range(1,4):head = Node(count, head)print head.data, head.next,headremoveItem = head.datahead = head.nextprint removeItem下图记录了删除第1个节点的情况:该操作使⽤的时间和内存都是常数的,这和数组上相同的操作有所不同。

⼆、从末尾删除从⼀个数组的末尾删除⼀项(python的pop操作)需要的时间和内存都是常数的,除⾮必须调整数组的⼤⼩。

对于单链表来说,从末尾删除的操作假设结构中⾄少有⼀个节点。

需要考虑如下的两种情况:只有⼀个节点。

head指针设置为None。

在最后⼀个节点之前没有节点。

代码搜索倒数第2个节点并将其next指针设置为None。

在这两种情况下,代码都返回了所删除的节点所包含的数据项。

形式如下:# coding: utf-8class Node(object):def __init__(self, data, next=None):self.data = dataself.next = nexthead = Nonefor count in range(1,4):head = Node(count, head)print head.data, head.next,headremoveItem = head.dataif head.next is None:head = Nodeelse:probe = headwhile probe.next.next != None:probe = probe.nextremoveItem = probe.next.dataprobe.next = Noneprint removeItem下图展⽰了从拥有3个节点的链表结构中删除最后⼀项的过程。

单链表的插入和删除

单链表的插入和删除

单链表的插⼊和删除近期,数据结构课上布置了运⽤单链表进⾏简单的插⼊和删除⼯作,今天,就在这⾥跟⼤家讲⼀下单链表的插⼊和删除是怎么弄的1.结点的定义typedef int ElemType;typedef int status;typedef struct LNode{ElemType data;struct LNode *next;}LNode, *LinkList;View Code这⾥的data就是我们链表⾥的数据元素了,next就是结点了也就是我们经常看到的p->next了。

2,创建链表接下来我们讲讲创建链表,⼀个好的链表结构离不开创建函数的作⽤,其中,创建链表⼜分为头插法和尾插法,头插法:也就是每次放⼊元素的时候⼜把指针指向头指针,也称为尾插法,因为这样创建的链表输⼊的元素其实是逆序排列的,尾插法:⾸先需要设置⼀个尾结点,然后每次插⼊完了之后把指针指向尾结点,这样就能保证是顺序输⼊的了。

头插法(倒插法):status CreateList_List(LNode*L,int n){int i,j;LNode *p; //以同样的格式定义⼀个p指针,⽤它来进⾏元素的输⼊//L=(LinkList) malloc(sizeof(LNode)); //这⾥就是给我们的链表分配存储空间了//L->next = NULL; //⾸先让L指向头指针//for(i=n;i>0;i--){p=(LinkList) malloc(sizeof(LNode)); //每输⼊⼀个数,就分配⼀个空间,这样可以有效的提⾼空间的利⽤率//printf("请输⼊该表的第%d个元素 :",i);scanf("%d",&j);p->data=j; //这⾥就是我们的元素啦//p->next=L->next; //让我们的p指针指向头结点//L->next=p; //这⾥还不是太懂,就不误导⼤家了//}printf("\n");return L; //相信有同学注意到了我的这⾥和书上是不⼀样的,没错,是真的//}因为考虑到指针返回的问题,单链表想要返回地址的话是要⽤到⼆级指针的,⼆级指针太过⿇烦了(其实是我不会啦),我在这⾥就⽤到了⼀个外部指针来接受我return的L,嘻嘻,是不是很聪明(反正我觉着还⾏),具体的⼤家会在我下⾯的主函数⾥⾯看到。

单链表的插入与删除

单链表的插入与删除

单链表的插⼊与删除继续之前的链表创建,现在就是链表的插⼊和删除了。

在链表这种特殊的数据结构中,链表的长短需要根据具体情况来设定,当需要保存数据时向系统申请存储空间,并将数据接⼊链表中。

对链表⽽⾔,表中的数据可以依此接到表尾或连结到表头,也可以视情况插⼊表中;对不再需要的数据,将其从表中删除并释放其所占空间,但不能破坏链表的结构。

这就是下⾯将介绍的链表的插⼊与删除。

1. 链表的删除如创建⼀个学⽣学号及姓名的单链表,即节点包括学⽣学号、姓名及指向下⼀个节点的指针,链表按学⽣的学号排列。

再从键盘输⼊某⼀学⽣姓名,将其从链表中删除。

⾸先定义链表的结构:从链表中删除⼀个节点有三种情况,即删除链表头节点、删除链表的中间节点、删除链表的尾节点。

题⽬给出的是学⽣姓名,则应在链表中从头到尾依此查找各节点,并与各节点的学⽣姓名⽐较,若相同,则查找成功,否则,找不到节点。

由于删除的节点可能在链表的头,会对链表的头指针造成丢失,所以定义删除节点的函数的返回值定义为返回结构体类型的指针。

struct node *delet(head,pstr)/*以head为头指针,删除pstr所在节点*/struct node *head;char *pstr;{struct node*temp,*p;temp = head; /* 链表的头指针*/if (head==NULL)/*链表为空*/printf("\nListis null!\n");else/*⾮空表*/{temp = head;while (strcmp(temp->str,pstr)!=0&&temp->next!=NULL)/* 若节点的字符串与输⼊字符串不同,并且未到链表尾*/{p = temp;temp = tmep->next;/* 跟踪链表的增长,即指针后移*/}if(strcmp(temp->str,pstr)==0) /*找到字符串*/{if(temp==head) { /* 表头节点*/printf("delete string :%s\n",temp->str);head = head->next;free(temp);/*释放被删节点*/}else{p->next=temp->next; /*表中节点*/printf("delete string :%s\n",temp->str);free(temp);}}elseprintf("\nno find string!\n");/*没找到要删除的字符串*/}return(head);}2. 链表的插⼊⾸先定义链表的结构:struct{int num; /*学⽣学号* /char str[20]; /*姓名* /struct node *next;} ;在建⽴的单链表中,插⼊节点有三种情况,如图所⽰;插⼊的节点可以在表头、表中或表尾。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单链表的删除操作,是指在单链表中,删除包括指定元素的结点。 有两种情况:一是删除单链表的第 i 个结点,二是删除单链表中,具有给定值 x 的结点。均不移动表 中的数据元素,只需改变,被删除结点的前一个结点指针。
Байду номын сангаас
计算机基础知识:单链表的删除操作
2014 海南事业单位招聘信息 | 海南事业单位考试真题及答案 在海南事业单位招聘(/hainan/?wt.mc_id=bk5870)考试中,计算机 专业知识的复习向来是考生复习备考阶段的一大重点,其中中公事业单位考试网为计算机基础知识的复习 为考生提供知识点梳理,帮助考生备考!
相关文档
最新文档