小工具知识网

当前位置: 首页 > 行业知识 > 数据结构第二周 :(顺序表求差集 +左奇右偶调整顺序表 + 合并有序单链表)

行业知识

数据结构第二周 :(顺序表求差集 +左奇右偶调整顺序表 + 合并有序单链表)

2026-11-04 14:47:52 来源:互联网转载

目录

  • 两个顺序表集合的差集
  • 顺序表左奇右偶的调整
  • 两个���序单链表的合并

    两个顺序表集合的差集

    【问题描述】两个顺序表集合的差集

    ()

    【样例输入】

    25 33 57 60 48 9 13 0

    ()

    12 50 23 60 4 34 25 13 0

    【样例输出】

    33 57 48 9

    #include#define Maxsize 100#define Elemtype inttypedef struct{    Elemtype elem[Maxsize];    int last;}SeqList;void InitList(SeqList * L){    L->last = -1; //表示表中无元素}void Input(SeqList * L){    int i = -1;    while(1){        Elemtype num;        scanf("%d",&num);        if(num != 0){            i++;            L->elem[i] = num;            L->last++;        }        else break;    }}void Output(SeqList * L){    int i;    for(i = 0; i last; i++){ //last为最后一个元素在数组中的位置        printf("%d ",L->elem[i]);    }    printf("\n");}void Difset(SeqList * La,SeqList * Lb,SeqList * Lc){    int i,j,k;    k = -1;    for(i = 0; i last; i++){        int flag = 0;        for(j = 0; j last; j++){            if(La->elem[i] == Lb->elem[j]){                flag = 1;                break;            }            if(La->elem[i] != Lb->elem[j]){                continue;            }        }        if(!flag){            k++;            Lc->elem[k] = La->elem[i];            Lc->last++;        }    }}int main(){    SeqList La,Lb,Lc;    InitList(&La);    InitList(&Lb);    InitList(&Lc);    Input(&La);    Input(&Lb);    Difset(&La,&Lb,&Lc);    Output(&Lc);    return 0;}

    顺序表左奇右偶的调整

    【问题描述】用课堂中讲解的方法调整顺序表的数据,使得左边为奇数,右边为偶数,要求时间复杂度为O(n)。

    【样例输入】25 34 57 50 16 48 9 62 0

    【样例输出】25 9 57 50 16 48 34 62

    【注意】0代表输入的结束

    #include#define Maxsize 100typedef struct{    int elem[Maxsize];    int last;}SeqList;void IniList(SeqList * L){    L->last = -1; //表示表中无元素}void Input(SeqList * L){    int i = -1;    while(1){        int num;        scanf("%d",&num);        if(num != 0){            i++;            L->elem[i] = num;            L->last++;        }        else break;    }}void Fanz(SeqList * L){    int i = 0;    int j = L->last;    while(i elem[i] % 2 != 0){ //为奇数            i++;        }        while(L->elem[j] % 2 == 0){            j--;        }        if(i elem[i];            L->elem[i] = L->elem[j];            L->elem[j] = temp;        }    }}void Output(SeqList * L){    int i; //int i 要单独写在for外面    for(i = 0; i last; i++){ //last为最后一个元素在数组中的位置        printf("%d ",L->elem[i]);    }    printf("\n");}int main(){    SeqList L;    IniList(&L);    Input(&L);    Fanz(&L);    Output(&L);    return 0;}

    两个有序单链表的合并

    【问题描述】两个不带头结点的有序单链表LA和LB的合并,请合并到LA表中再输出,LB表的空间全部释放。

    【样例输入】

    1 3 5 7 9 0

    1 2 3 4 15 20 0

    【样例输出】

    1 2 3 4 5 7 9 15 20

    【注意】0代表输入结束

    #include#includetypedef struct Node{    int data;    struct Node* next;}Node,*Linklist;void InitList(Linklist* L){ //指针指向 一个指向节点的 指针    *L = (Linklist)malloc(sizeof(Node)); //建立头节点    (*L)->next = NULL; //头节点next为空}void CreatFromTail(Linklist L){ //L是指向带头结点的空链表    Node *p,*pr;    pr = L;    p = NULL;    while(1){        int num;        scanf("%d",&num);        if(num == 0){            break;        }        else{            p = (Linklist)malloc(sizeof(Node));            p->data = num;            if(L->next == NULL){                L->next = p;                p->next = NULL;                pr = pr->next; //pr永远指向最后一个节点            }            else{                pr->next = p;                p->next = NULL;                pr = pr->next;            }        }    }}void MergeList(Linklist La,Linklist Lb,Linklist Lc){    Linklist p,q,t;    p = La->next;    q = Lb->next;    t = Lc;    while(p != NULL && q != NULL){        if(p->data data){            t->next = p;            t = p; //t指向p指的位置,而不是t跟着p            p = p->next;        }        else if(q->data == p->data){ //if 后的两个else只可择其一            if(q->next != NULL){                q = q->next;            }            else{                p = p->next;            }        }        else{//不能用if(q->data data) 可能会存在空的现象,if会判断,else会跳过            t->next = q;            t = q;            q = q->next;        }    }        if(p != NULL){            t->next = p;        }        if(q != NULL){            t->next = q;        }}void Output(Linklist L){    Linklist p;    p = L->next; //指向头节点后的第一个节点    while(p->next != NULL){        printf("%d ",p->data);        p = p->next;    }    printf("%d",p->data); //输出最后一个节点    printf("\n");}int main(){    struct Node* La = NULL;    struct Node* Lb = NULL;    struct Node* Lc = NULL;    InitList(&La); //形参为二级指针,应该传指针的地址    InitList(&Lb);    InitList(&Lc);    CreatFromTail(La);    CreatFromTail(Lb);    MergeList(La,Lb,Lc);    Output(Lc);    return 0;}

上一篇:怎么不用服务器发布网站?

下一篇:轻松下载Temp文件的方法指南,详细步骤解析!