链表知识

一、顺序表

类似数组
1.建立顺序表

void CreatList(SqList *&L,类型 a[],int n)
{
    L = (SqList *)malloc(sizeof(SqList));
    for(int i=1;i<=n;i++)
    {
        L->data[i] = a[i];
    }
}

2.顺序表的归并(思想与顺序表归并类似,见下面)

顺序表和数组思想一样,也可以用链表做

int UnionList(int A[],int B[])
{
    int i=1,j=1,k=0;
    while(i <= n && j <= m)
    {
        if(A[i] < B[j])
        {
            C[k] = A[i];
            k++;
            i++;
        }
        else
        {
            C[k] = B[j];
            k++;
            j++;
        }
    }
    while(i <= n)
    {
        C[k] = A[i];
        i++;
        k++;
    }
    while(j <= m)
    {
        C[k] = B[j];
        j++;
        k++;
    }
    return k;
}
二、单链表

需要结构体:
struct nod
{
类型 data;
struct node *next;
}
1.插入节点——头插法(逆序,与输入的顺序相反)

void CreateList(node *&L,类型 a[],int n)
{
    struct node *p;
    L = (node *)malloc(sizeof(node));
    L->next = NULL;
    for(int i=1;i<=n;i++)
    {
        p = (node *)malloc(sizeof(node));
        p->data = a[i];
        p->next = L->next;
        L->next = p;
    }
}

2.插入节点——尾插法(正常顺序)

void CreateList(node *&L,类型 a[],int n)
{
    struct node *p,*s;
    L = (node *)malloc(sizeof(node));
    s = L;
    for(int i=1;i<=n;i++)
    {
        p = (node *)malloc(sizeof(node));
        p->data = a[i];
        s->next = p;
        s = p;
    }
    s->next = NULL;
}

3.输出线性表

void DispList(node *L)
{
    node *p;
    p = L->next;
    while(p!=NULL)
    {
        printf("%d",p->data);
        p = p->next;
    }
}

4.删除节点(将链表中重复的元素删除)相同的只留一个

//删除线性表中相同的元素
    p = L->next;
    while(p!= NULL)
    {
        q = p;
        r = q->next;
        while(r!=NULL)
        {
            if(p->data == r->data)  //先保持一个元素不变(P),另一个后移(r,q).
            {
                q->next = r->next;    //把 r 删掉
                r = q->next;         // r 重新赋值为q 的后继节点
                n--;
            }
            else  //若两个不相同,就后移。
            {
                r = r->next;   //r 后移
                q = q->next;  //q 后移一个
            }
        }
        p = p->next;  //都遍历完一次换下一个节点
    }

5.删除线性表中数据为e的元素(不只有一个):

p = L;
while(p->next!=NULL)
{
    if(p->next->data == e )
    {
        q = p->next;
        p->next = q->next;
        free(q);
    }
    else
       p = p->next;
 }

6.无序的链表转化成有序链表

void sort(node *&L)
{
    struct node *p,*pre,*q;
    p = L->next->next;      // p 指向L 的第二个数据点
    L->next->next = NULL;    //构造只含一个数据点的有序单链表
    while(p!=NULL)
    {
        q = p->next;        //q 存放p 节点的后继节点的指针
        pre = L;
        //前一个元素与后一个元素相比,前< 后,则pre后移
        while(pre->next !=NULL && pre->next->data < p->data)
            pre = pre->next;
        //否则:
        p->next = pre->next;
        pre->next = p;
        p = q;
    }

    //输出链表元素
    p = L->next;
    while(p!=NULL)
    {
        printf("%d",p->data);
        if(p->next != NULL)
            printf(" ");
        p = p->next;
    }
}
三、双链表

1.建立双向链表
struct nod
{
类型 data;
struct node *next;
struct node *prior;
}
头插法:

void CreateList(node *&L,类型 a[],int n)
{
    struct node *p;
    L = (node *)malloc(sizeof(node));
    L->next = L->prior = NULL;
    for(int i=1;i<=n;i++)
    {
        p = (node *)malloc(sizeof(node));
        p->data = a[i];
        p->next = L->next;
        if(L->next != NULL)
            L->next = L->prior = p;
        L->next = p;
        s->prior = L;
    }
}

尾插法:

void CreateList(node *&L,类型 a[],int n)
{
    struct node *p,*s;
    L = (node *)malloc(sizeof(node));
    s = L;
    for(int i=1;i<=n;i++)
    {
        p = (node *)malloc(sizeof(node));
        p->data = a[i];
        s->next = p;
        p->prior = s;
        s = p;
    }
    s->next = NULL;
}

2.输出某一元素的前驱与后继

for(int j=1;j<=m;j++)
    {
        //输入要查找前驱,后继的元素
        scanf("%d",&e);
        p = L->next;   //第一个元素的位置,首节点是第一个元素

        p->prior = NULL;  /*一开始做的时候第一个节点的前驱判断不了,因为第一个节点的前驱为 L ,不为空
                            前驱节点等于L 也不可以,所以直接把 p前驱节点设为空*/
        while(p!=NULL)
        {
            if(p->data == e)
            {
                if(p->next != NULL && p->prior != NULL)
                    printf("%d %d\n",p->prior->data,p->next->data);
                else if(p->next == NULL && p->prior != NULL)
                    printf("%d\n",p->prior->data);
                else if(p->next != NULL && p->prior == NULL)
                    printf("%d\n",p->next->data);
            }
            p = p->next;
        }
    }
四、循环链表
五、有序表

1.有序链表的归并

用三个顺序表,LA,LB,LC,其中LA,LB存放输入数据,LC存放LA,LB两者之间较小的那个。

void UnionList(node *LA,node *LB)
{
    struct node *LC;
    struct node *pa = LA->next,*pb = LB->next,*r,*s;
    LC = (node *)malloc(sizeof(node));
    r = LC;
    //将pa(LA),pb(LB)中较小的一个元素放入LC中
    while(pa!=NULL && pb!=NULL)
    {
        if(pa->data < pb->data)
        {
            s = (node *)malloc(sizeof(node));
            s->data = pa->data;
            r->next = s;
            r = s;
            pa = pa->next;
        }
        else
        {
            s = (node *)malloc(sizeof(node));
            s->data = pb->data;
            r->next = s;
            r = s;
            pb = pb->next;
        }
    }

    //若LA比较长,则比较完后将剩下的元素直接放入LC中
    while(pa!=NULL)
    {
        s = (node *)malloc(sizeof(node));
        s->data = pa->data;
        r->next = s;
        r = s;
        pa = pa->next;
    }
    //同理若LB比较长,则比较完后将剩下的元素直接放入LC中
    while(pb!=NULL)
    {
        s = (node *)malloc(sizeof(node));
        s->data = pb->data;
        r->next = s;
        r = s;
        pb = pb->next;
    }
    r->next = NULL;
    s = LC->next;
    while(s!=NULL)
    {
        printf("%d ",s->data);
        s = s->next;
    }
}
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REaDME.md或论文文件(如有),本项目用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、资源1项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值