单链表的表示,循环链表等

//方法1:
typedef struct Lnode*pointer;
struct LNode
{
    ElemType data;//数据域
    pointer next;//指针域
};
typedef pointer LinkList;
//方法2:
typedef struct LNode
{
    ElemType data;//数据域
    structLNode *next;//指针域
}LNode*LinkList;//LNode(结构体了类型),LinkList(结构体指针类型)都是类型名
 

2.单链的查询操作

  • 按序号进行查找

//按序号查找(单链表)
Status GetElem_Lk(LinkList L,int i,ElemType &e)
//在带头结点的单链表L中查找第i个元素
{
    p = L->next;j = 1;
    while(p != NULL && j<i)
    {
        p = p->next;
        j++;
    }
    if(p == NULL || j>i)
        return ERROR;
    e = p->data;
    return OK;
}

  • 按元素值进行查找

LNode *LocateElem_Lk(LinkList L,ElemType x)
//在带头结点的单链表L中查找值为x的元素
{
    p = L->next;
    while(p != NULL && p->data != x)
        p = p->next;
    return p;
}

3.单链表的插入操作

Status Insert_L(LinkList &L,int i,ElemType x)
{
    P = L;j = 0;
    while(p != NULL && j<i-1)
    {
        p = p->next;
        j++;
    }
    if(p == NULL || j>i-1)
        return ERROR;
    s = new LNode;//申请结点空间
    s->data = x;
    s->next = p->next;
    p->next = s;
    return OK;
}

4.单链表的删除

Status Delete_L(LinkList &L,int i,ElemType &x)
{
    p = L;j = 0;
    while(p->next != NULL && j<i-1)
    {
        p = p->next;
        j++;
    }
    if(p->next == NULL || j>i-1)
        return ERROR;
    s = p->next;//s指向被删除结点
    p->next = s->next;//修改被删除结点前驱指针域的值
    x = s->data;//将被删除结点的值保存到变量x中
    delete s;//释放被删除结点的空间
    return OK;
}

5.创建单链表


//前插法创建单链表
void Create_L_F(LinkList &L,int n)
//逆序输入n个元素的值,建立带头结点的单链表L
{
    L = new LNode;//申请结点空间作为单链表的表头结点
    L->next = NULL;//将表头结点的指针域置空
    for(i = 1;i <= n;i++)
    {
        cin>>x;//输入元素x
        s->data = x;//将x存入s结点中
        s->next = L-next;L->next = s;//将s插入到表头
    }
}

//后插法创建单链表
void Create_L_L(LinkList &L,int n)
//顺序插入n个元素的值,建立带头结点的单链表L
{
    L = newLNode;//申请结点空间
    L->next = NULL;//将表头结点的指针域置空
    r = L;//尾指针r指向头结点
    for(i = 1;i <= n;i++)
    {
        cin>>x;//输入元素s
        s->data = x;//将x存入s结点中
        s->next = NULL;r->next = s;//将s插入到表尾
        r = s;//r指向新的尾结点
    }
}

 

6.循环链表的定义

//头尾指针 

void join1(CLinkList &L1,CLinkList L2)
{
    p = L1;
    while(p->next != L1)//n次
        p = p->next;
    p->next = L2->next;
    while(p->next != L2)//m次
        p = p->next;
    p->next = L1;
    delete L2;
}

时间复杂度为O(m+n)

//两个尾指针的算法
void union1(CLinkList &r1,CLinkList r2)
{
    L1 = r1->next;
    L2 = r2->next;
    r1->next = L2->next;
    r2->next = L1;
    delete L2;
    r1 = r2;
}

时间复杂度为O(1)

 

7.双向链表的存储结构

typedef struct DLNode{
    ElemType data;
    struct DLNode *prior;
    struct DLNode *next;
}DLNode,*DLinkList;

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值