王道2023线性表部分代码

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

// 单链表
typedef struct LNode{
    int data;
    struct LNode * next;
}LNode, *LinkList;

// 头插法
LinkList head_insert(LinkList * L){
    LNode * s;
    (*L) = (LinkList)malloc(sizeof(LNode));
    (*L)->next = NULL;
    int x = 0;

    printf("请输入插入的数据(输入9999为结束输入):\n");
    scanf("%d",&x);
    while(x != 9999){
        s = (LNode *)malloc(sizeof(LNode));
        s->data = x;
        s->next = (*L)->next;
        (*L)->next = s;
        printf("请输入插入的数据(输入9999为结束输入):\n");
        scanf("%d",&x);
    }
    return *L;
}
// 尾插法
LinkList tail_insert(LinkList*L){
    (*L) = (LinkList)malloc(sizeof(LNode));
    LNode *r,*s; // 指向头结点
    r = (*L);
    int x = 0;

    printf("请输入插入的数据(输入9999为结束输入):\n");
    scanf("%d",&x);
    while(x != 9999){
        s = (LNode *)malloc(sizeof(LNode));
        s->data = x;
        r->next = s;
        r = s;

        printf("请输入插入的数据(输入9999为结束输入):\n");
        scanf("%d",&x);
    }
    r->next = NULL;

    return *L;
}
LinkList loop_tail_insert(LinkList * L){
    (*L) = (LinkList)malloc(sizeof(LNode));
    LNode *r,*s; // 指向头结点
    r = (*L);
    int x = 0;

    printf("请输入插入的数据(输入9999为结束输入):\n");
    scanf("%d",&x);
    while(x != 9999){
        s = (LNode *)malloc(sizeof(LNode));
        s->data = x;
        r->next = s;
        r = s;

        printf("请输入插入的数据(输入9999为结束输入):\n");
        scanf("%d",&x);
    }
    r->next = (*L);
    return *L;
}
// 按序号查找结点
LNode* getelementsequence(LinkList L, int i){
    LNode * s = L;
    for(int j = 1; j<=i; j++){
        s = s->next;
    }
    return s;
}
// 按照值查找结点
LNode* getelementvalue(LinkList L, int value){
    LNode * s = L->next;
    for(int j = 1;j!=value;j++){
        s = s->next;
    }
    return s;
}
// 插入某个结点
LinkList insertLNode(LinkList *L, int i, int data){
    LNode * s = (*L);
    LNode * r = NULL;
    s = getelementsequence(*L,i-1);
    r = (LNode *)malloc(sizeof(LNode));
    r->data = data;
    r->next = s->next;
    s->next = r;
    (*L)->data++;
    return *L;
}

LinkList insertLNode1(LinkList L, int i, int data){
    LNode * s = L;
    LNode * r = NULL;
    s = getelementsequence(L,i-1);

    r = (LNode *)malloc(sizeof(LNode));
    r->data = data;
    r->next = s->next;
    s->next = r;
    L->data++;
    return L;
}
// 删除某个结点
LinkList deletelement(LinkList *L, int i){
    LNode * s = (*L)->next;
    LNode * r = NULL;
    s = getelementsequence(*L,i-1);
    r = s->next;
    s->next = r->next;
    free(s);// 忘写 
    (*L)->data--;
    return *L;
}
// 打印每个结点
void output(LinkList L){
    LNode *s = L->next;
    for(int i =1;s!=NULL;i++){
        printf("%d\n",s->data);
        s = s->next;
    }
}
void loop_output(LinkList L){
    LNode *s = L->next;
    for(int i =1;s!=L;i++){
        printf("%d\n",s->data);
        s = s->next;
    }
}
// 双链表
typedef struct DNode{
    int data;
    struct DNode * prior, *next;
}DNode, *DLinklist;
// 双链表尾插法
DLinklist D_tail_insert(DLinklist * D){
    (*D) = (DLinklist)malloc(sizeof(DNode));
    (*D)->prior = NULL;
    DNode *r,*s;
    r = (*D);
    int x = 0;
    int length = 0;
    printf("请输入插入的数据(输入9999结束输入):\n");
    scanf("%d",&x);
    while(x != 9999){
        s = (DNode*)malloc(sizeof(DNode));
        s->data = x;
        r->next = s;
        s->prior = r;
        r = s;
        length++;
        printf("请输入插入的数据(输入9999结束输入):\n");
        scanf("%d",&x);
    }
    r->next = NULL;
    (*D)->data = length;
    return *D;
}
DLinklist Loop_D_tail_insert(DLinklist * D){
    (*D) = (DLinklist)malloc(sizeof(DNode));
    (*D)->prior = NULL;
    DNode *r,*s;
    r = (*D);
    int x = 0;
    int length = 0;
    printf("请输入插入的数据(输入9999结束输入):\n");
    scanf("%d",&x);
    while(x != 9999){
        s = (DNode*)malloc(sizeof(DNode));
        s->data = x;
        r->next = s;
        s->prior = r;
        r = s;
        length++;
        printf("请输入插入的数据(输入9999结束输入):\n");
        scanf("%d",&x);
    }
    r->next = (*D)->next;
    (*D)->next->prior = r;
    (*D)->data = length;
    return *D;
}
// 双链表插入
DLinklist insertDNode(DLinklist * D, int i, int data){
    DNode * r = (*D)->next;
    DNode * s = (DLinklist)malloc(sizeof(DNode));
    for(int j = 1;j<i-1;j++){
        r = r->next;
    }
    s->data = data;
    s->next = r->next;
    r->next->prior = s;
    r->next = s;
    s->prior = r;
    (*D)->data++;
    return *D;
}
// 双链表删除
DLinklist deleteDNode(DLinklist * D, int i){
    DNode *s = (*D)->next;
    for(int j = 1;j<i-1;j++){
        s = s->next;
    }
    DNode *r = s->next;
    s->next = r->next;
    r->next->prior = s;
    free(r);
    (*D)->data--;
    return (*D);
}
// 打印每个结点
void D_output(DLinklist D){
    DNode * s = D->next;
    for(int j = 1;j<=D->data;j++){
        printf("%d\n",s->data);
        s = s->next;
    }
}
// 第一题
// 结构体在上边
// 不带头结点不会写
LinkList nohead_tail_build(LinkList*L, int *length){
    int data = 0;
    printf("请输入数据(输入9999为结束输入:)\n");
    scanf("%d",&data);
    LNode * s, *r;
    (*L) = (LinkList)malloc(sizeof(LNode));
    // 对首元结点的处理
    if (data!= 9999){
        (*L)->data = data;
        printf("请输入数据(输入9999为结束输入:)\n");
        scanf("%d",&data);
        (*length)++;
    }
    else{
        (*L) = NULL;
        return (*L);
    }
    r = (*L);
    while(data!=9999){
        s = (LNode*)malloc(sizeof(LNode));
        s->data = data;
        r->next = s;
        r = s;
        (*length)++;
        printf("请输入数据(输入9999为结束输入:)\n");
        scanf("%d",&data);
    }
    r->next = NULL;
    
    return (*L);
}
// 不带头结点的头插法
// 不带头结点的头插法如何逆序(头结点提前处理)
LinkList nohead_head_build(LinkList*L, int*length){
    int data = 0;
    (*L) = (LinkList)malloc(sizeof(LNode));
    LNode *s;
    printf("请输入数据(输入9999为结束输入:)\n");
    scanf("%d", &data);
    if (data != 9999){
        (*L)->data = data;
        (*L)->next = NULL;
        (*length)++;
        printf("请输入数据(输入9999为结束输入:)\n");
        scanf("%d", &data);
    }
    else{
        (*L) = NULL;
        return (*L);
    }
    while(data != 9999){
        s = (LNode*)malloc(sizeof(LNode));
        s->data = data;
        s->next = (*L);
        (*L) = s;
        (*length)++;
        printf("请输入数据(输入9999为结束输入:)\n");
        scanf("%d", &data);
    }
    return (*L);
}
// output
void nohead_output(LinkList L, int length){
    LNode * s;
    s = L;
    for(int j = 0;j<length;j++){
        printf("%d\n",s->data);
        s = s->next;
    }
}
// 第一题 只能free 不能打印
void free_node(LinkList *L, int x, int *length){
    LNode *p;
    if ((*L)->data == x){
        p  = (*L);
        (*L) = (*L)->next;
        free(p);
        (*length)--;
    }
    else{
        *L = (*L)->next;
    }
    if ((*L) != NULL){
        free_node(L, x, length);
    }
}
// 第二题
void Delete_x_Node(LinkList *L, int x){
    LNode *s, *r;
    r = *L;
    s = r->next;
    while(s != NULL){
        if (s->data == x){
            r->next = s->next;
            free(s);
            s = r->next;
        }
        else{
            r = r->next;
            s = r->next;
        }
    }
}
// 第三题
// 主函数
    // LinkList L;
    // tail_insert(&L);
    // output(L);
    // printf("\n");
    // reverse_output(L->next);// 将头指针mute
void reverse_output(LinkList L){
    
    if (L->next !=NULL){
        reverse_output(L->next);
        printf("%d\n",L->data);
    }
    else{
        printf("%d\n",L->data);
    }

}
// 第四题 
void Delet_min(LinkList *L){
    LNode *s = (*L)->next;
    (*L)->data = 9999;
    int index = 0;
    while(s != NULL){
        if ((s->data)< (*L)->data){
            (*L)->data = s->data;
            index++;
        } 
        s = s->next;
    }
    LNode * r = (*L);
    LNode * q = r->next;
    while(q->data != (*L)->data||q == NULL){
        r = r->next;
        q = q->next;
    }
    r->next = q->next;
    free(q);
}
// 第五题
// 想法有问题
// 我想的是直接在原先地方不变,以至于无法在头上设置NULL 也无法修改
// 答案直接将原先地方修改 头上变成NULL 最后把修改好的加在链表中
void reverse_stay(LinkList *L){
    LNode * before;
    LNode * now = (*L)->next;
    LNode * after = now->next;
    // 首先将头设置为NULL
    now->next = NULL;
    while(after){
        before = now;
        now = after;
        after = after->next;
        // 为什么这时候now->next=before不改变L
        // 因为在上边now = after
        now->next = before;
    }
    (*L)->next = now;
}
// 第六题
void sort_Linklist(LinkList * L){
    int t = 0;
    // 选择
    for(LNode *s = (*L)->next; s->next != NULL ;s = s->next){
        for (LNode *r = s->next; r != NULL;r = r->next){
            if (r->data<s->data){
                t = r->data;
                r->data = s->data;
                s->data = t;
            }
        }
    }
}
// 第七题 先排序再删除
void Delet_between_a_and_b(LinkList *L, int a, int b){
    sort_Linklist(L);
    LNode *A, *B;
    LNode *s = (*L)->next;
    while(s->next!=NULL){
        if(s->data<a && s->next->data>=a){
            A = s;
        }
        if (s->data<b && s->next->data>=b){
            B = s->next;
        }
        s = s->next;
    }
    if (A!=NULL &&B!=NULL){
        A->next = B;
    }
}
// 第八题
LNode * common_node(LinkList L1, LinkList L2){
    int t = 0;
    LNode *s;
    LNode *r;
    s = L1->next;
    r = L2->next;
    if (L1->data>L2->data){
        t = L1->data - L2->data;
        while(t!=0){
            s = s->next;
            t--;
        }
    }
    else{
        t = L2->data - L1->data;
        while(t!=0){
            r = r->next;
            t--;
        }
    }
    while(s->next != r->next){
        s = s->next;
        r = r->next;
    }
    return s->next;
}
// 第九题
void free_everynode(LinkList *L){
    if ((*L)->next != NULL){
        (*L) = (*L)->next;
        free_everynode(L);
    }
    else{
        LNode *s = (*L);
        free(s);
    }
}
void sort_and_free(LinkList *L){
    sort_Linklist(L);
    free_everynode(L);
}
// 第十题
// odd为奇数 even为偶数
// 空间复杂度太高
// 题理解错误 不是数 是序号
void split_to_two_Linklisterror(LinkList *L, LinkList *odd, LinkList *even){
    LNode *s = (*L)->next;
    *even = (LinkList)malloc(sizeof(LNode));
    *odd = (LinkList)malloc(sizeof(LNode));
    LNode *o = (*odd);
    LNode *e = (*even);
    o->next = NULL;
    e->next = NULL;
    while(s != NULL){
        LNode * Nodeo = (LNode*)malloc(sizeof(LNode));
        LNode * Nodee = (LNode*)malloc(sizeof(LNode));
        if (s->data % 2 == 0){
            Nodeo = (LNode*)malloc(sizeof(LNode));
            Nodeo->data = s->data;
            Nodeo->next = o->next;
            o->next = Nodeo;
            o = Nodeo;
        }
        else{
            Nodee = (LNode*)malloc(sizeof(LNode));
            Nodee->data = s->data;
            Nodee->next = e->next;
            e->next = Nodee;
            e = Nodee;
        }
        s = s->next;
    }
}
// 出错次数很多
// 主要原因:
// 中间想让一个指向head 另一个指向nexthead 后来发现head进入next nexthead也进入这个数
// 对指针的理解不牢固
void split_to_two_Linklist(LinkList L, LinkList * even, LinkList *odd){
    LNode* head = L->next;
    LNode* nexthead = head->next;
    *odd = (LinkList)malloc(sizeof(LNode));
    *even = (LinkList)malloc(sizeof(LNode));
    LNode * o = *odd;
    LNode * e = *even;

    o->next = head;
    e->next = nexthead;

    o = o->next;
    e = e->next;

    while (e&&e->next) {
        o->next = e->next;
        o = o->next;
        e->next = o->next;
        e = e->next;
    }
    o->next = NULL;
}
//第十一题
//与第十一题相似,最后将b原地逆序即可
void spilt_Linklist(LinkList L, LinkList *a, LinkList *b){
    split_to_two_Linklist(L, a, b);
    reverse_stay(a);
}
// 第十二题
void delete_same_element(LinkList *L){
    LNode * head = (*L)->next;
    LNode * nexthead = head->next;
    while(nexthead){
        if (head->data == nexthead->data){
            head->next = nexthead->next;
        }
        else{
            head = head->next;
        }
        nexthead = nexthead->next;
    }
}
// 第十三题
void rebuild_a_drop_list(LinkList a, LinkList b, LinkList * c){
    // 首先逆序
    reverse_stay(&a);
    reverse_stay(&b);
    LNode *s, *m, *n;
    (*c) = (LinkList)malloc(sizeof(LNode));
    m = a->next;
    n = b->next;
    s = (*c);
    while(m&&n){
        if (m->data>=n->data){
            s->next = m;
            m = m->next;
        }
        else if(m->data<n->data){
            s->next = n;
            n = n->next;
        }
        s = s->next;
    }
    if (m==NULL){
        s->next = n;
    }
    else{
        s->next = m;
    }
}
// 第十四题
void common_list(LinkList a, LinkList b, LinkList *c){
    (*c) = (LinkList)malloc(sizeof(LNode));
    LNode *x, *y;
    LNode * head = (*c);
    LNode *temp;
    x = a->next;
    y = b->next;
    while(x&&y){
        if(x->data == y->data){
            temp = (LNode*)malloc(sizeof(LNode));
            temp->data = x->data;
            temp->next = head->next;
            head->next = temp;
            head = temp;
            x = x->next;
            y = y->next;
        }
        else if(x->data>y->data){
            y = y->next;
        }
        else{
            x = x->next;
        }
    }
}
// 第十五题
void intersection_list(LinkList a, LinkList b, LinkList * c){
    (*c) = (LinkList)malloc(sizeof(LNode));
    LNode * x, *y, *z, *temp,*head;
    x = a->next;
    y = b->next;
    z = (*c);
    head = (*c);
    head->next = NULL;
    while(x&&y){
        if(x->data<y->data){
            x = x->next;
        }
        else if(x->data>y->data){
            y = y->next;
        }
        else{
            temp = (LNode*)malloc(sizeof(LNode));
            temp->data = x->data;
            temp->next = head->next;
            head->next = temp;
            head = temp;
            x = x->next;
            y = y->next;
        }
    }
}
// 第十六题 KMP 暂时跳过
// 第十七题
bool symmetric_dlist(DLinklist D){
    DNode * head, *rear;
    head = D->next;
    rear = head->prior;
    while(head!=rear && head->next != rear){
        if(head->data!=rear->data){
            printf("false");
            return false;
        }
        head = head->next;
        rear = rear->prior;
    } 
    printf("true");
    return true;
}
// 第十八题
void connect_two_loop_Linklist(LinkList*a, LinkList*b){
    LNode *a_head,* a_rear, *b_head, *b_rear;
    a_head = (*a)->next;
    b_head = (*b)->next;
    while(a_head->next != (*a)){
        a_head = a_head->next;
    }
    a_rear = a_head;
    while(b_head->next != (*b)){
        b_head = b_head->next;
    }
    
    b_rear = b_head;
    a_rear->next = (*b)->next;
    b_rear->next = (*a);
}
// 第十九题
void delete_min_node(LinkList *L){
    LNode *head = (*L)->next;
    int temp = 0;
    for(LNode * s = head; s->next != (*L); s = s->next){
        for(LNode * r = s->next; r->next != (*L); r = r->next){
            if(s->data>=r->data){
                temp = s->data;
                s->data = r->data;
                r->data = temp;
            }
        }
    }
    // 逆序再递归
    LNode *drop;
    while (head!=(*L)){
        drop = head;
        head = head->next;
        (*L)->next = head;
        free(drop);
    }
}
// 第二十题
typedef struct LDNode{
    struct LDNode * pred;
    struct LDNode * next;
    int data;
    int freq;
}LDNode, *LDlist;
// 尾插法
void LD_tail(LDlist*LD){
    (*LD) = (LDlist)malloc(sizeof(LDNode));
    LDNode * r, *s;
    r = (*LD);
    r->pred = NULL;
    int x = 0;
    printf("请输入插入的数据(输入9999为结束输入:)\n");
    scanf("%d",&x);
    while(x != 9999){
        s = (LDNode*)malloc(sizeof(LDNode));
        s->data = x;
        s->freq = 0;
        r->next = s;
        s->pred = r;
        r = s;
        printf("请输入插入的数据(输入9999为结束输入:)\n");
        scanf("%d",&x);
    }
    r->next = NULL;
}
void LD_output(LDlist LD){
    LDNode * r;
    r = LD->next;
    while(r){
        printf("%d\n",r->data);
        r = r->next;
    }
}
LDNode* Locate(LDlist *LD, int x){
    LDNode *s = (*LD)->next;
    LDNode *r = s->pred;
    int data, freq;
    while(s){
        if (x == s->data){
            s->freq++;
            while(r&&r->pred){
                if (r->freq<s->freq){

                    data = r->data;
                    r->data = s->data;
                    s->data = data;

                    freq = r->freq;
                    r->freq = s->freq;
                    s->freq = freq;
                    s = r;
                    r = r->pred;
                }
                else{
                    r = r->pred;
                }
            }
        }
        s = s->next;
        r = s;
    }
    return (*LD)->next;
}
// 第二十一题
// bool circular(LinkList L){
//     LNode * s = L->next;
//     while()
// }
// 第二十二题

bool returnreciprocalnumber(LinkList L, int k){
    int length = 0;
    int i = 0;
    LNode *s = L->next;
    LNode *r = L->next;
    while(s->next){
        length++;
        s = s->next;
    }
    if (length<k){
        printf("没找到");
        return false;
    }
    else{
        while(i != length-k+1){
            r = r->next;
            i++;
        }
    }
    printf("\n");
    printf("%d\n", r->data);
    return true;
    
}
// 第二十三题
// 与第八题相同
// 第二十四题
// 1.为hash 空间换时间
// 2.为排序
// 最后的顺序不对
void delete_equal_abs(LinkList *L){
    LNode *s = (*L)->next;
    int temp = 0;
    int a,b;
    for(LNode *x = (*L)->next; x != NULL; x = x->next){
        for(LNode * y = x->next; y != NULL; y = y->next){
            a = x->data;
            b = y->data;
            if (a<0){
                a = -a;
            }
            if (b<0){
                b = -b;
            }
            if (a<b){
                temp = x->data;
                x->data = y->data;
                y->data = temp;
            }
        }
    }
    LNode * m = (*L)->next;
    LNode * n = m->next;
    while(n){
        if(m->data == n->data||m->data == -n->data){
            m->next = n->next;
            n = n->next;
        }
        else{
            m = m->next;
            n = n->next;
        }
    }
}
int main(){
    LinkList L;
    tail_insert(&L);
    reverse_stay(&L);
    // returnreciprocalnumber(L, 2);
    // LDlist LD;
    // LD_tail(&LD);
    // LD_output(LD);
    // Locate(&LD, 2);
    // printf("\n");
    // LD_output(LD);
    // LinkList L;
    // loop_tail_insert(&L);
    // loop_output(L);
    // printf("\n");
    // delete_min_node(&L);
    // loop_output(L);
    // LinkList a,b;
    // loop_tail_insert(&a);
    // loop_tail_insert(&b);
    // loop_output(a);
    // printf("\n");
    // loop_output(b);
    // printf("\n");
    // connect_two_loop_Linklist(&a, &b);
    // loop_output(a);
    // DLinklist D;
    // Loop_D_tail_insert(&D);
    // D_output(D);
    // symmetric_dlist(D);
    // LinkList a, b, c;
    // tail_insert(&a);
    // tail_insert(&b);
    // intersection_list(a,b,&c);
    // output(c);
    // LinkList L;
    // tail_insert(&L);
    // delete_same_element(&L);
    // output(L);
    // LinkList L, a, b;
    // tail_insert(&L);
    // spilt_Linklist(L, &a, &b);
    // printf("\n");
    // output(a);
    // printf("\n");
    // output(b);
    // LinkList L, odd, even;
    // tail_insert(&L);
    // output(L);
    // split_to_two_Linklist(L,&odd,&even);
    // printf("\n");
    // output(odd);
    // printf("\n");
    // output(even);
    // tail_insert(&L);
    // output(L);
    // sort_and_free(&L);
    // LinkList L;
    // int a = 0;
    // int b = 0;
    // printf("请输入a,b的值\n");
    // scanf("%d %d",&a,&b);
    // tail_insert(&L);
    // printf("\n");
    // output(L);
    // Delet_between_a_and_b(&L, a,b);
    // printf("\n");
    // output(L);
    // tail_insert(&L);
    // output(L);
    // printf("\n");
    // Delet_min(&L);
    // output(L);
    // LinkList L;
    // tail_insert(&L);
    // output(L);
    // printf("\n");
    // reverse_output(L->next);// 将头指针mute
    // int x = 0;
    // printf("请输入需要释放的元素的值:");
    // scanf("%d", &x);
    // tail_insert(&L);
    // output(L);
    // printf("\n");
    // Delete_x_Node(&L, x);
    // output(L);
    // Free_x_Node(&L, &length, x);
    // LinkList L;
    // LNode * s;
    // // head_insert(&L);
    // tail_insert(&L);
    // output(L);
    // insertLNode(&L,2,3);
    // output(L);
    // DLinklist D;
    // D_tail_insert(&D);
    // D_output(D);
    // insertDNode(&D,2,3);
    // deleteDNode(&D, 2);
    // D_output(D);
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

抽象带篮子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值