数据结构自学记录(二):单链表

代码实现:

//
// Created by ly on 18-11-9.
//
#include <bits/stdc++.h>
using namespace std;
typedef struct Node* ptrLNode;
struct Node {
    int data;
    ptrLNode next;

}LNode;
//头插法,建立单链表
void CreateListF(ptrLNode &L,int a[],int n)
{
    ptrLNode s;
    int i;
    L = (ptrLNode)malloc(sizeof(LNode));
    L->next = NULL; //创建头结点
    for(int i = 0;i < n;i++)
    {
        s = (ptrLNode)malloc(sizeof(LNode));
        s->data = a[i];
        s->next = L->next;
        L->next = s;
    }
}

//尾插法,建立单链表
void CreateListR(ptrLNode &L,int a[],int n)
{
    ptrLNode s,r;
    int i;
    L = (ptrLNode)malloc(sizeof(LNode));
    r = L;
    for(int i = 0;i < n;i++)
    {
        s = (ptrLNode)malloc(sizeof(LNode));
        s->data = a[i];
        r->next = s;
        r = s;
    }
    r->next = NULL;
}

//初始化线性表
void InitList(ptrLNode &L)
{
    L = (ptrLNode)malloc(sizeof(LNode));//创建头结点
    L->next = NULL;
}

//销毁线性表Destory(L)
void DestroyList(ptrLNode &L)
{
    ptrLNode pre,p;
    pre = L;
    p = L->next;
    while(p != NULL)
    {
        free(pre);
        pre = p;
        p = p->next;
    }
    free(pre);
}

//判断线性表是否为空表
bool isEmpty(ptrLNode L)
{
    return (L->next == NULL);
}

//求链表的长度
int ListLength(ptrLNode L)
{
    int len = 0;
    ptrLNode p;
    p = L;
    while (p->next != NULL)
    {
        ++len;
        p = p->next;
    }
}

//求线性表中位置I的元素
bool GetElem(ptrLNode L,int i,int &e) {
    int j = 0;
    ptrLNode p = L;
    while (j < i && p != NULL) {
        ++j;
        p = p->next;
    }
    if (p == NULL)
        return false;
    else {
        e = p->data;
        return true;
    }
}

//按元素值查找,时间复杂度为O(n)
int LocateElem(ptrLNode L,int key)
{
    int i = 1;
    ptrLNode p = L->next;
    while(p != NULL && p->data != key) {
        p = p->next;
        i++;
    }
    if(p == NULL)
        return 0;
    else
        return i;

}

//插入数据元素
bool ListInsert(ptrLNode &L,int i,int key)
{
    int j = 0;
    ptrLNode p = L;
    ptrLNode s;
    while(j < i-1 && p != NULL)
    {
        j++;
        p = p->next;
    }
    if(p == NULL)
    {
        return false;
    } else {
        s = (ptrLNode) malloc(sizeof(LNode));
        s->data = key;
        s->next = p->next;
        p->next = s;
        return true;
    }
}
//删除数据元素
bool ListDelete(ptrLNode &L,int i,int key)
{
    int j = 0;
    ptrLNode p = L;
    ptrLNode q;
    while (j < i-1 && p->next != NULL)
    {
        j++;
        p = p->next;
    }
    if(p == NULL)
        return false;
    else {
        q = p->next;
        if(q == NULL)
        {
            return false;
        }
        key = q->data;
        p->next = q->next;
        free(q);
        return true;
    }
}
//for test
void PrintList(ptrLNode L)
{
    ptrLNode p;
    p = L->next;
    cout << "begin" << endl;
    while(p != NULL)
    {
        cout << p->data << " ";
        p = p -> next;
    }
    cout << endl;
    cout << "end" << endl;

}

//算法设计 删除单链表中值域最大的节点
void deleteMaxNode(ptrLNode &L)
{
    ptrLNode pre = L;
    ptrLNode p = L->next;
    ptrLNode maxPre = pre;
    ptrLNode maxP = p;
    while(p != NULL)
    {
        if(maxP->data < p->data)
        {
            maxP = p;
            maxPre = pre;
        }
        pre = p;
        p = p->next;
    }
    maxPre->next = maxP->next;
    free(maxP);
}

//算法设计 单链表排序
void ListSort(ptrLNode &L)
{
    ptrLNode p,pre,q;
    p = L->next->next;
    L->next->next = NULL;
    while(p != NULL)
    {
        q = p->next;
        pre = L;
        while (pre->next != NULL && pre->next->data < p->data)
        {
            pre = pre->next;
        }
        p->next = pre->next;
        pre->next = p;
        p = q; //扫描原单链表余下的结点
    }
}

//算法设计  ,单链表的所有结点逆之
//方式1:头插法建表
void Reverse(ptrLNode &L)
{
    ptrLNode p,q;
    p = L->next;
    L->next = NULL;
    while(p != NULL) {
        q = p->next;
        p->next = L->next;
        L->next = p;
        p = q;
    }
}
//解法2
void Reverse2(ptrLNode L)
{
    ptrLNode p,q,r;
    p = L->next;
    q = L->next->next;
    r = L->next->next->next;
    // 同步向后面移动...


}
//算法设计:将L,分割成L1,L2
void split(ptrLNode &L,ptrLNode &L1,ptrLNode &L2)
{
    ptrLNode p,q,r1;
    L1 = L;
    r1 = L;
    L2 = (ptrLNode)malloc(sizeof(LNode));
    L2->next = NULL;
    while(p != NULL) {
        r1->next = p;
        r1 = p;
        p = p->next;
        q = p->next;
        p->next = L2->next;
        L2->next = p;
        p = q;
    }
    r1->next = NULL;
}

//单链表实现:荷兰国旗问题
void move2(ptrLNode &L)
{
    //准备工作
    ptrLNode L1,L2,r,r1,r2,p;
    L1 = NULL;
    L2 = NULL;
    p = L->next;
    r = L;
    //插入工作
    while(p != NULL)
    {
        //插入到L,头插法
        if(p->data == 0)
        {
            r->next = p;
            r = p;
        }
        //建立L1不带头结点的单链表
        else if(p->data == 1) {
            if (L1 == NULL)
                L1 = p, r1 = p;
            else {
                r1->next = p;
                r1 = p;
            }
        }
        //建立L2不带头结点的单链表
        else {
            if(L2 == NULL)
            {
                L2 = p;r2 = p;
            } else{
                r2->next = p;
                r2 = p;
            }
        }
        p = p->next;
    }
    //结尾工作
    r->next = r1->next = r2->next = NULL;
    r->next = L1;
    r1->next = L2;
}

int main(void)
{
    int a[] = {1,2,3,4,5,6,7,8,9};
    int len = sizeof(a) / sizeof(int);
    cout << len << endl;
    ptrLNode L;
    //L = (ptrLNode)malloc(sizeof(LNode));
    CreateListF(L,a,len);
    PrintList(L);
    ptrLNode L1;
    CreateListR(L1,a,len);
    PrintList(L1);

    cout << endl;

    //for test  sort
    int b[] = {123,5,12,3,4,13,4,5};
    int len2 = sizeof(b) / sizeof (int);
    ptrLNode L2;
    CreateListF(L2,b,len2);
    ListSort(L2);
    PrintList(L2);
    //for test Reverse
    Reverse(L2);
    PrintList(L2);
    int b1[] = {1,0,2,1,0,0,1,2,2,1,0,2};
    ptrLNode BL;
    CreateListR(BL,b1,12);
    cout << "BL.........." << endl;
    PrintList(BL);
    move2(BL);
    PrintList(BL);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值