单链表的链式插入和删除

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define FALSE 0
#define ERROR 0
#define TRUE 1
typedef int ElemType;
typedef int Status;
typedef struct Node
{
ElemType Data;
struct Node *next;
}List;
List L,*Ptrl;
//返回链表的长度
Status Length(List *Ptrl)
{
List *p = Ptrl;
int i=0;


//链表不为空
while(p)
{
//下一个结点,计数加一
p=p->next;
i++;
}
return i;
}
//根据位置返回结点
List* FindKth(int k,List *Ptrl)
{
List *p=Ptrl;
int i =1;
//结点不为空且当前结点序号小于给定序号
while(p&&i<k)
{
//下一个结点,计数加一
p=p->next;
i++;
}
//序号相等
if(i==k)
{
return p;
}
else
{
return NULL;
}
}
//根据给定值返回结点
List* Find(ElemType x,List *Ptrl)
{
List *p = Ptrl;
//结点不为空且数据域不为给定值
while(p&&p->Data!=x)
{
p=p->next;
}
return p;
}
List* Insert(ElemType x,int i,List *Ptrl)
{
List *s,*p;
//在头结点处插入
if(i==1)
{
//给新结点分配空间
s=(List*)malloc(sizeof(List));
s->Data = x;
s->next = Ptrl;
return s;
}
//找到给定序号的前一个结点
p = FindKth(i-1,Ptrl);
if(p==NULL)
{
return NULL;
}
else
{
//给新结点分配空间
s=(List*)malloc(sizeof(List));
s->Data= x;
s->next=p->next;
p->next = s;
return Ptrl;
}
}
List* Delete(int i,List *Ptrl)
{
List *s,*p;
//删除头结点
if(i==1)
{
if(Ptrl!=NULL)
{
Ptrl = Ptrl->next;
return Ptrl;
}
else 
{
return NULL;
}
}
//找到给定序号的前一个结点
p=FindKth(i-1,Ptrl);
if(p==NULL)
{
return NULL;
}
else if(p->next==NULL)
{
return NULL;
}
else
{
s=p->next;
p->next=s->next;
free(s);
return Ptrl;
}
}
int main(){  
    List* p=(List*)malloc(sizeof(List));  
    p->next = NULL;  
    p->Data=2;  
    p=Insert(5,1,p);  
    p=Insert(3,2,p);  
    p=Insert(5,2,p);  
    printf("长度为:%d \n ",Length(p)); 
printf("%d",p->Data);
printf("%d",p->next->Data);
printf("%d",p->next->next->Data);
printf("%d",p->next->next->next->Data);
    List* po = FindKth(2,p);  
    if(po==NULL)  
        printf("不存在\n");  
    else{  
        printf("%d\n",po->Data);  
        printf("%d",p->next->Data);


    }  
    p=Delete(2,p);  
    po = FindKth(2,p);  
    if(po==NULL)  
       printf("不存在\n");   
    else{  
        printf("%d\n",po->Data);  
    }  
    return 0;  
}  







好的,我会为您详细解答。 单链表是一种链式存储结构,它由若干节点组成,每个节点包含数据域指针域。其中,数据域存储节点的数据,指针域指向下一个节点的地址。 1. 插入节点 在单链表插入一个节点,需要先找到插入位置的前一个节点,然后将新节点插入到该节点后面。 具体操作如下: - 创建一个新节点,并为其分配内存空间; - 将新节点的指针域指向插入位置的后继节点; - 将插入位置的前驱节点的指针域指向新节点。 下面是一个示例代码: ``` // 定义节点结构体 struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; // 在单链表插入节点 ListNode* insertNode(ListNode* head, int val, int pos) { ListNode* newNode = new ListNode(val); if (pos == 0) { newNode->next = head; return newNode; } ListNode* preNode = head; for (int i = 0; i < pos - 1; i++) { preNode = preNode->next; } newNode->next = preNode->next; preNode->next = newNode; return head; } ``` 2. 删除节点 在单链表删除一个节点,需要先找到待删除节点的前一个节点,然后将前一个节点的指针域指向待删除节点的后继节点。 具体操作如下: - 找到待删除节点的前驱节点; - 将前驱节点的指针域指向待删除节点的后继节点; - 释放待删除节点的内存空间。 下面是一个示例代码: ``` // 在单链表删除节点 ListNode* deleteNode(ListNode* head, int val) { ListNode* preNode = NULL; ListNode* curNode = head; while (curNode != NULL && curNode->val != val) { preNode = curNode; curNode = curNode->next; } if (curNode == NULL) { return head; } if (preNode == NULL) { head = curNode->next; } else { preNode->next = curNode->next; } delete curNode; return head; } ``` 希望我的回答能够帮助您理解单链表插入删除操作。如果您有任何疑问,请随时向我提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值