> 文档中心 > 成长随心记8(单链表)

成长随心记8(单链表)

typedef struct node {//单链表
    struct node* next;//指向下一节点的指针
    int data;//数据
}Lnode,*linklist;

bool init(linklist& L) {//单链表的初始化
    L = new Lnode;
    L->next = NULL;
    return true;
}

bool create1(linklist& L, int n) {//前插法创建单链表(正位序)n表示数据个数
    Lnode* s = L;//定义一个指针指向头结点
    srand((unsigned)time(0) + rand());//为了让随机数随机
    for (int i = 0; i < n; i++) {
        Lnode* p = new Lnode;//创建一个新节点p
        p->data = rand() % 10;//随机数据给这个节点
        //cin >> p->data;//输入数据给这个节点
        p->next = NULL;//新结点指向空
        s->next = p;//尾结点指向新节点p
        s = p;//s指针指向尾结点p
    }
    return true;
}

bool create2(linklist& L, int n) {//后插法建立单链表(逆位序)n表示数据个数
    srand((unsigned)time(0) + rand());//为了让随机数随机
    for (int i = 0; i < n; i++) {
        Lnode* p = new Lnode;//创建一个新节点p
        //p->data = rand() % 10;//随机数据给这个节点
        cin >> p->data;//输入数据给这个节点
        p->next = L->next;//新节点指向第一个数据
        L->next = p;//头节点指向新节点
    }
    return true;
}

bool show(linklist& L) {//单链表的展示
    Lnode* s = L->next;//指针s指向第一个数据
    while (s) {//然后依次向后遍历,直到为空
        cout <data;
        s = s->next;
    }
    return true;
}

bool dele(linklist& L, int i) {//单链表第i个位置上的删除
    int count = 1;//count用来标记第i位置上的前一个数据,用s指针指向这个数据
    Lnode* s = L->next;
    if (i == 1) {
        L->next = s->next;
    }
    else {
        while (count < i - 1) {
            s = s->next;
            count++;
        }
        Lnode* p = s->next;//p指向要删除的数据
        s->next = p->next;//要删除数据的前一个数据指针指向删除数据的后一个数据
        delete p;
    }
    return true;
}

bool max(linklist& L, int& e) {//求单链表的最大值
    Lnode* s = L->next;  
    int max = 0;
    while (s) {
        if (max data)
            max = s->data;
        s = s->next;
    }
    return true;
}

bool delsection(linklist& L) {//单链表某递增区间值的删除
    int mink = 0, maxk = 0;//左值和右值
    Lnode* p = L;//用两个相邻指针来进行删除操作
    Lnode* s = L->next;
    cin >> mink >> maxk;
    while (s) {
        if (s->data >= mink && s->data <= maxk) {//如果大于左值且小于右值则删除
            p->next = s->next;
            s = s->next;
        }
        else {//否则指针向后移一位
            p = s;
            s = s->next;
        }
    }
    return true;
}

bool insert(linklist& L, int i, int e) {//单链表第i个位置的插入
    Lnode* p = L;
    if (i == 1) {//如果插入的是第一位置
        Lnode* s = new Lnode;
        s->data = e;
        s->next = p->next;
        p->next = s;
    }
    else {
        while (i>1) {
            p = p->next;
            i--;
        }
        Lnode* s = new Lnode;
        s->data = e;
        s->next = p->next;
        p->next = s;
    }
    return true;
}

bool reverse(linklist& L) {//单链表的逆置
    Lnode* p = L->next, * q;//p指向单链表的第一个数据,p用来遍历,q用来插入空表
    L->next = NULL;//将表置空
    while (p) {
        q = p;//q指向p的位置
        p = p->next;//p指向下一个位置
        q->next = L->next;//将q用头插法插入到空表中
        L->next = q;
    }
    return true;
}
 
int main()
{
    linklist L;
    int e = 0;
    init(L);
    create1(L, 5);
    //create2(L, 6);
    show(L);
    //delsection(L);
    //insert(L, 5, 5);
    cout << endl;
    //dele(L, 3);
    //max(L, e);
    reverse(L);
    show(L);
}