链式线性表

存储结构

typedef struct LNode
{
    ElemType date;
    struct LNode *next;
}LNode,*LinkList;

这里定义了LNode的结构体ElemType是为了复用代码

//如果是单纯的数据int...
typedef int ElemType;
//如果是复杂的数据类型那就结构体咯
typedef struct XXX
{
     string name;
     int age;
}ElemType;

注意!!!

我们为了后面操作的方便,我们在使用某个链表的时候都是带有头空节点的链表

LinkList p,r,L1,L2,L3;
int j;

//初始化链表
int InitList(LinkList &L)
{
    L = new LNode;
    L->next=NULL;
    return 1;
}

基础代码

//获取链表i位置上的元素
int GetDataLinklist(LinkList L, int i, ElemType &e)
{
        
    p = L->next;
    j = 1;
    while (p&&j<i)
    {
        p = p->next;
        ++j;
    }
    if(!p||j>i)
        return 0;//没有找到
    e = p->date;//返回元素
    return 1;
}
LNode *LocateElem_L(LinkList L, ElemType e){
    LinkList q; 
    q=L->next;
    while(q && q->date!=e) 
    q=q->next;
    return q;// 按值查找
}
//插入
int InsertLinklist(LinkList &L, int i, ElemType e)
{
    j = 1;
    p = L;
    LinkList s;
    while (j<i&&p!=NULL)  
    {
        j++;
        p = p->next;
    }
    if(p!=NULL)
    {
        InitList(s);
        s->date = e;
        s->next = p->next;
        p->next = s;
        return true;
    }
    else
        return 0;
}
//删除元素
int DelLinklist(LinkList &L, int i, ElemType &e)
{
    j = 1;
    p = L;
    LinkList s;
    while (j<i&&p)
    {
        j++;
        p = p->next;
    }
    if(p==NULL)
            return false;
    else
    {
        s=p->next;
        if(s==NULL)
            return false;
        p->next=s->next;//删除q节点 
        free(s);
        return true;
    }
    
}
//尾插法
void CreatLinklist_R(LinkList &L,int n)
{
    InitList(L);
    L->next = NULL;
    r = L;

    for (int i = 0; i < n; i++)
    {
        p = new LNode;
        cin >> p->date;
        p->next = NULL;
        r->next = p;
        r = p;
    }
    r->next = NULL;
}

//循环单链表
void CreatLinklist_(LinkList &L,int n)
{
    InitList(L);
    L->next = NULL;
    r = L;

    for (int i = 0; i < n; i++)
    {
        p = new LNode;
        cin >> p->date;
        p->next = NULL;
        r->next = p;
        r = p;
    }
    r->next = L->next;
}
//头插法
void CreatLinklist_H(LinkList &L,int n)
{
    InitList(L);
    L->next = NULL;
    for (int i = 0; i < n; i++)
    {
        p = new LNode;
        cin >> p->date;
        p->next = L->next;
        L->next = p;
    }
}
void Printlist(LinkList L)
{
    p = L->next;
    while (p!=NULL)
    {
        printf("%d ", p->date);
        p = p->next;
    }
    puts("");
}
//这是我的作业部分,找两个上升序列的差集
void slove(LinkList La,LinkList Lb,LinkList &Lc)
{
    LinkList p = La->next;
    ElemType e;
    while (p!=NULL)
    {
        e = p->date;
        if(LocateElem_L(Lb, e)==NULL)
        {
            InsertLinklist(Lc, 1, e);
        }
        p = p->next;
    }
    Printlist(Lc);
}
//约瑟夫环
void solve(int n,int m)
{
     
    CreatLinklist_(L1,n);//创建一个循环链表
    LinkList p = L1->next,head;
    head = p->next;
    int cnt = 1;
    LinkList s;
    while (p!=head)
    {
        if(cnt<m)
        {
            head = p;
            p = p->next;
            cnt++;
        }
        else{
            head->next = p->next;
            s = p;
            cout << s->date << " ";
            p = p->next;
            free(s);
            cnt = 1;
        }
    }
    cout << p->date;
    free(p);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值