数据结构——链表的基本操作

来源:互联网 发布:mysql unixtime 转换 编辑:程序博客网 时间:2024/06/07 05:14

怎么说呢? 这个代码是好久之前学链表时写的,在codeblocks上编译通过了,以前测试过了,现在没测试就直接复制到上面,有什么问题欢迎指正,O(∩_∩)O谢谢

具体代码如下:


#include<bits/stdc++.h>#define N 1009using namespace std;typedef struct Node{    int  data;    struct Node *next;}Lnode, *LinkList;void menu(){    printf("\t\t\t   单链表基本操作\n\n");    printf("\t\t\t1.建  立  单  链  表\n");    printf("\t\t\t2.遍  历  单  链  表\n");    printf("\t\t\t3.计  算  链 表 长 度\n");    printf("\t\t\t4.链  表  逆  置\n");    printf("\t\t\t5.删  除  偶 数 节 点\n");    printf("\t\t\t6.生 成 值 有 序 单 链 表\n");    printf("\t\t\t7.合  并 生 成 降  序  链 表\n");    printf("\t\t\t8.合  并 生 成 升  序  链 表\n");    printf("\t\t\t9.分  解  链  表\n");    printf("\t\t\t0.退          出\n\n");}/*初始化空表*/bool Init_Linklist(LinkList &L){    L=(LinkList)malloc(sizeof(Lnode));    if(!L) return false;    L->next=NULL;    return true;}/*尾插法建立单链表*/bool Creat_Linklist(LinkList &L){    int x;    LinkList p,rear;    Init_Linklist(L);    rear = L;    printf("输入-1表示输入结束\n");    while(scanf("%d",&x),x != -1)    {        p = (LinkList)malloc(sizeof(Lnode));        if(!p) return false;        p->data = x;        rear->next = p;        rear = p;    }    rear->next = NULL;    return true;}/*单链表遍历*/void Disp_Linklist(LinkList L){    LinkList p;    p = L->next;    while(p)    {        printf("%d ", p->data);        p = p->next;    }    printf("\n");}/*计算单链表长度*/int length_Linklist(LinkList L){    int count = 0;   /*count表示单链表长度*/    LinkList p;    p = L->next;    while(p)    {        count++;        p = p->next;    }    return count;}/*单链表逆置*/void Reverse_Linklist(LinkList L){    LinkList p, q, tm;    p = L->next;    q = p->next;    if(!q) return ;    p->next = NULL;    while(q)    {        tm = q->next;        q->next = p;        p = q;        if(!tm) break;        q = tm;    }    L->next = q;}/*删除值为偶数的结点*/void DelEven_Linklist(LinkList L){    LinkList p, q;    p = L;    q = p->next;    while(q)    {        if(!(q->data&1))        {            p->next = q->next;            free(q);            q = p->next;            continue;        }        p = q;        q = q->next;    }}/*在有序单链表中插入元素,链表仍然有序,插入成功返回true,插入失败返回false*/bool Insert_Linklist(LinkList L, int x){    LinkList p, q;    p = L;    q = p->next;    while(q)    {        if(q->data > x)        {            LinkList s = (LinkList)malloc(sizeof(Lnode));            s->data = x;            s->next = q;            p->next = s;            return true;        }        p = q;        q = q->next;    }    LinkList s = (LinkList)malloc(sizeof(Lnode));    s->data = x;    s->next = NULL;    p->next = s;    return true;}/*创建非递减有序单链表,创建成功返回true,创建失败返回false*/bool CreatOrder_Linklist(LinkList &L){    int x;    printf("请输入有序链表,以文件尾结尾\n");    Init_Linklist(L);    while(~scanf("%d", &x))Insert_Linklist(L, x);    return true;}/*两个非递减有序单链表La和Lb合并成一个非递增有序链表Lc*/void MergeDescend_Linklist(LinkList La, LinkList Lb, LinkList &Lc){    LinkList a, b, c, cur;    a = La->next;    b = Lb->next;    c = Lc = La;    c->next = NULL;    while(a&&b)    {        if(a->data > b->data)        {            cur = b->next;            b->next = c->next;            c->next = b;            b = cur;            continue;        }        cur = a->next;        a->next = c->next;        c->next = a;        a = cur;    }    while(a)    {        cur = a->next;        a->next = c->next;        c->next = a;        a = cur;    }    while(b)    {        cur = b->next;        b->next = c->next;        c->next = b;        b = cur;    }}/*两个非递减有序单链表La和Lb合并成一个非递减有序链表Lc*/void MergeAscend_Linklist(LinkList La, LinkList Lb, LinkList &Lc){    LinkList pa, pb, pc;    pa = La->next;    pb = Lb->next;    pc = Lc = La;    while(pa && pb)    {        if(pa->data <= pb->data)        {            pc->next = pa;            pc = pa;            pa = pa->next;        }        else        {            pc->next = pb;            pc = pb;            pb = pb->next;        }    }    pc->next = pa ? pa : pb;    free(Lb);}/*链表La按值分解成两个链表,La全部为奇数,Lb全部为偶数*/void Split_Linklist(LinkList La, LinkList &Lb){    LinkList p, q, b;    p = La;    q = p->next;    b = Lb = La;    while(q)    {        if(q->data&1) continue;        b->next = q;        b = q;        p->next = q->next;        q = q->next;    }}int main(){    int choice, length;    LinkList L, La, Lb, Lc;    while(1)    {        menu();        printf("选择你的操作:");        scanf("%d",&choice);        switch(choice)        {        case 1:            if(Creat_Linklist(L))                printf("单链表创建成功\n");            else                printf("单链表创建失败\n");            break;        case 2:            Disp_Linklist(L);            break;        case 3:            length = length_Linklist(L);            printf("单链表长度为:%d\n",length);            break;        case 4:            Reverse_Linklist(L);            printf("逆置后的链表为:\n");            Disp_Linklist(L);            break;        case 5:            DelEven_Linklist(L);            printf("新链表为:\n");            Disp_Linklist(L);            break;        case 6:            if(CreatOrder_Linklist(L))            {                printf("值有序链表为:\n");                Disp_Linklist(L);            }            else                printf("单链表创建失败\n");            break;        case 7:            CreatOrder_Linklist(La);            CreatOrder_Linklist(Lb);            MergeDescend_Linklist(La, Lb, Lc);            printf("合并后的新链表为:\n");            Disp_Linklist(Lc);            break;        case 8:            CreatOrder_Linklist(La);            CreatOrder_Linklist(Lb);            MergeAscend_Linklist(La, Lb, Lc);            printf("合并后的新链表为:\n");            Disp_Linklist(Lc);            break;        case 9:            Creat_Linklist(L);            Split_Linklist(L, Lb);            printf("分裂后的新链表为:\n");            Disp_Linklist(L);            Disp_Linklist(Lb);            break;        case 0:            return 0;        default:            printf("输入错误,请重新输入\n");        }    }}


原创粉丝点击