数据结构——单链表操作(一)——基础用法

本文详细介绍了单链表的基本概念及各种操作实现,包括结点类型定义、存储分配、基本遍历、查找、插入和删除等核心算法。此外还提供了链表创建、长度计算、合并等实用案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.单链表结点的类型定义普通结构体变量或者指向结构体的指针变量
typedef int Elemtype;
typedef struct node
{
    Elemtype data;
    struct node *next;
}LNode,*Linklist;

声明的相对应操作:

LNode *h,*p;//定义一个结点
Linklist h,p;//定义头指针

(*p)表示p所指向的结点
(*p).data<=>p->data表示p指向结点的数据域
(*p).next<=>p->next表示p指向结点的指针域

二.申请一块LNode类型的存储单元的操作,并将其地址赋值给变量p
LNode *p;
p=new LNode;
三.链表的相关操作

(1)初始化:定义工作指针P,链表为带头结点的链表

void printlink(LinkList &L)
{
    LNode *p;
    p=L->next;
    while(p!=NUll)
    {
        printf("%d\n",L->data);
        p=p->next;
    }
}

(2)链表的递归遍历操作

//正向输出链表
void out1(Linklist L)
{
    if(L)
    {
        printf("%d\n",L->data);
        out1(L->next);
    }
}
//逆序输出链表
void out2(Linklist L)
{
    if(L)
    {
        out2(L->next);
        printf("%d\n",L->data);
    }

}

(3)求链表的长度

//求链表的长度
int linklength(Linklist H)
{
    LNode *p;
    int j=0;
    p=H->next;
    while(p!=NULL)
    {
        j++;
        p=p->next;
    }
    return j;
}

(4)查找表中第i个位置的元素

Linklist touch(Linklist &H,int x)
{
    LNode *p;
    p=H->next;
    int j=0;
    while(p!=NUll&&j<x)
    {
        p=p->next;
        j++;
    }
    if(p==NULL) {printf("无此元素\n");return NULL;}
    else return p;
}

(5)查找p的前驱节点

//查找前驱结点
LinkList  ListLocate2(LinkList H, LNode *p)  
{
    LNode *pre;
    if(H->next==pre) {printf("此节点为首元结点,无前驱结点\n");return NULL;}
    pre=H->next;
    while(pre!=NULL&&pre->next!=p)
    {
        pre=pre->next;
    }
    if(pre==NULL) {printf("找不到\n");return NULL;}
    else return pre;
    
}

(6)查找p的后继结点

//查找后继结点
Linklist finddata(Linklist H,Elemtype e)
{
    LNode *p;
    p=H->next;
    while(p!=NULL&&p->data!=e)
    {
        p=p->next;
    }
    if(p==NULL) {printf("找不到\n");return NULL;}
    else if(p->next==NULL)  {printf("此结点没有后继节点\n");return NULL;}
    else return p->next;
}

(7)插入新结点(在p结点之后插入)

void  Insert(LinkList H,LNode *p,int x)                                  
{ 	
      LNode *s;
      s=new LNode;            //创建新结点
      s->data=x;                  //设置新结点的元素值
      s->next=p->next;    
      p->next=s;    //插入新结点  
}

(8)插入新结点(在p结点之前插入)

void  Insert(LinkList H,LNode *p,int x)
{
    LNode *pre,*s;
    pre=H;
    while(pre!=NULL&&pre->next!=x)
        pre=pre->next;
    if(pre==NULL)
    {
        printf("无p节点\n");
        return ;
    }
    s->data=x;
    s->next=pre->next;
    pre->next=s;
}

(9)头插法创建链表:时间复杂度为O(n),可以实现逆序操作

Linklist1 creat()//头插法
{
    Linklist L,p;
    L=new LNode;
    L->next=NULL;
    scanf("%d",&x);
    while(x!=flag)
    {
        p=new LNode;
        p->data=x;
        p->next=L->next;
        L->next=p;
        scanf("%d",&x);
    }
    return L;
}

(10)尾插法创建链表,要定义尾指针,时间复杂度为O(n)

Linklist2 creat()
{
    Linklist L,p;
    L=new LNode;
    L->next=NULL;
    r=L;
    scanf("%d",&x);
    while(x!=flag)
    {
        p=new LNode;
        p->data=x;
        p->next=r->next;
        r->next=p;
        r=p;
        scanf("%d",&x)
    }
    return L;
}

(11)合并两个(非递减有序)链表

Linklist Union(Linklist La,Linklist Lb)
{
    LNode *pa,*pb,*pc,*Lc;
    pa=La->next;pb=Lb->next;
    Lc=La;
    pc=pa;
    while(pa&&pb)
    {
        if(pa->data<=pb->data)
        {
            pc->next=pa;
            pc=pa;
            pa=pa->next;
        }
        else 
        {
            pc->next=pb;
            pc=pb;pb=pb->next;
        }
    }
    if(pa) pc->next=pa;
    else pc->next=pb;
    delete Lb;
    return Lc;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值