非循环单链表

/*coder:cyl   time: 2020.12.1*/

#include<bits/stdc++.h>
using namespace std;
#define MAXSIZE  1000
#define ElemType int
#define Status   int
#define ERROR    -1
#define OK        1
int n;
typedef struct LNode{
    ElemType data;
    struct LNode *next;
} LNode,*LinkList;

Status ListInit_L(LinkList &L){
    L=(LinkList)malloc(sizeof(LNode));//头结点申请地址
    if(!L){//if(L==NULL)
        printf("分配内存失败!\n");
        exit(OVERFLOW);
    }
    else
        L->next=NULL;
    return OK;
}

Status ListIn(LinkList &L, int n) {
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;//先建立一个带头结点的单链表
    LinkList p;
    srand(unsigned(time(0)));  //初始化随机数种子
    for(int i=n;i>0;--i)
    {
        p=(LinkList)malloc(sizeof(LNode));
        p->data=rand()%100+1; //随机生成100以内的数字,比scanf()操作简单些
        //插入到表头
        p->next=L->next;
        L->next=p; //将结点p连接在头结点L之后
    }
    return OK;
}

Status ListOut(LinkList L) {
    LinkList p = L->next;
    int k = 0;
    if (!p) {
        printf("这是一个空目录!\n");
        return ERROR;
    }
    printf("单链表:\n");
    while (p) {
        p = p->next;
        k++;
    }
    for (int j = 0; j < k; j++) {
        cout << "[" << j << "]" << "\t";
    }
    cout<<endl;
    p = L->next;
    while (p) {
        cout << p->data;
        if(p->next)cout<<"->\t";
        else cout<<"^";
        p = p->next;
    }
    cout<<endl;
    return OK;
}

Status ListInsert(LinkList &L, int i, ElemType e) {
    LinkList p,s;
    int j=0;
    p=L;
    while(p&&j<i-1){
        p=p->next;
        j++;
    }
    if(!p||j>i-1){
        cout<<"插入失败"<<endl;
        return ERROR;
    }
    s=(LinkList)malloc(sizeof(LNode));
    s->data=e;
    s->next=p->next;
    p->next=s;
    cout<<"插入完成"<<endl;
    return OK;
}

bool ListEmpty(LinkList L) {
    if (L->next==NULL)return true;
    else return false;
}

Status ListLength(LinkList L) {
    LinkList p;
    int k=0;
    p=L->next;
    while(p){
        k++;
        p=p->next;
    }
    return k;
}

Status GetElem(LinkList L, int i, ElemType &e) {
    int j;
    LinkList p;
    p= L->next;
    j=1;
    while(p&&j<i){
        p=p->next;
        j++;
    }
    if(!p||j>i)return ERROR;
    e=p->data;
    return e;
}

Status compare1(ElemType a, ElemType b) {
    if(a==b)return 1;
    else return 0;
}
Status compare2(ElemType a, ElemType b) {
    if(a>b)return 1;
    else return 0;
}
Status compare3(ElemType a, ElemType b) {
    if(a<b)return 1;
    else return 0;
}

Status LocateElem(LinkList L, ElemType e,Status (*compare)(ElemType,ElemType)) {
    LinkList p;
    int k=1;
    p=L->next;
    while(p){
        if(compare(p->data,e)){
            cout<<"第一个满足关系的结点序号是"<<k<<endl;
            return OK;
        }
        p=p->next;
        k++;
    }
    cout << "链表中没有该数据" << endl;
    return ERROR;
}

Status PriorElem(LinkList L, ElemType e, ElemType &pre_e) {
    LinkList p,q;
    q=L->next;
    p=q->next;
    while(p){
        if(p->data==e){
            pre_e=q->data;
            cout<<"元素" << e << "的前驱是:" << pre_e << endl;
            return OK;
        }
        q=p;
        p=q->next;
    }
    cout << "不存在此数据" << endl;
    return ERROR;
}

Status NextElem(LinkList L, ElemType e, ElemType &next_e) {
    LinkList p,q;
    q=L->next;
    p=q->next;
    while(p){
        if(q->data==e){
            next_e=p->data;
            cout<<"元素" << e << "的后驱是:" << next_e << endl;
            return OK;
        }
        q=p;
        p=q->next;
    }
    cout << "不存在此数据" << endl;
    return ERROR;
}

Status DeleteElem(LinkList &L,int i, ElemType &e) {
    LinkList p,q;
    int j=0;
    p=L;
    while(p->next&&j<i-1){
        p=p->next;
        j++;
    }
    if(!p->next||j>i-1)return ERROR;
    q=p->next;
    p->next=q->next;
    e=q->data;
    free(q);
    cout << "删除的元素是" << e << endl;
    return OK;
}

Status ClearList(LinkList &L) {
    L->next=NULL;
    return OK;
}

Status CleanList(LinkList &L){
    LNode *p,*s,*q;
    p=L->next;
    if(!p)    return ERROR;
    while(p->next)
    {
        q=p;
        while(q->next)                //固定p所指结点,向后遍历,寻找与之数据域相同的结点
        {
            if(q->next->data==p->data)    //在这里将q->next所指的结点存放数据与p作比较
            {
                s=q->next;
                q->next=s->next;
                free(s);
            }
            else q=q->next;
        }
        p=p->next;
    }
    return  OK;
}

Status converse(LinkList &L)
{
    LinkList p,q;
    p=L->next;
    L->next=NULL;
    while(p)
    {
        /*向后挪动一个位置*/
        q=p;
        p=p->next;
        /*头插*/
        q->next=L->next;
        L->next=q;
    }
    return OK;
}

Status Menus() {
    cout << "1.在第i个结点之前插入一个结点" << endl;
    cout << "2.判断链表是否为空" << endl;
    cout << "3.求链表中结点的个数" << endl;
    cout << "4.取第i个结点" << endl;
    cout << "5.查找第1个与某结点满足compare()关系的结点的序号" << endl;
    cout << "6.返回某元素的前驱" << endl;
    cout << "7.返回某元素的后驱" << endl;
    cout << "8.删除第i个结点的数据域" << endl;
    cout << "9.把一个非循环单链表赋值给另一个非循环单链表表" << endl;
    cout << "10.顺序表置空" << endl;
    cout << "11.删除单链表中的重复值" << endl;
    cout << "12.非循环单链表的逆置" << endl;
    cout<<"13.多项式运算"<<endl;
    cout<<"14.随机生成单链表"<<endl;
    cout << "0.结束操作" << endl << endl;
    cout << "请输入你要执行操作的序号:" << endl;
    cin >> n;
    return n;
}

int main() {
    int num, problem;
    LinkList L;
    srand(time(0));
    num=rand()%10+5;
    ListInit_L(L);
    ListIn(L, num);
    ListOut(L);
    cout << endl;
    problem = Menus();
    while (problem != 0) {
        if (problem == 1) {
            int i, e;
            cout << "请输入插入结点的位置:i" << endl;
            cin >> i;
            cout << "请输入插入结点的值:e" << endl;
            cin >> e;
            ListInsert(L, i, e);
            ListOut(L);
        } else if (problem == 2) {
            if (ListEmpty(L))cout << "链表为空" << endl;
            else cout << "链表不为空" << endl << endl;
        } else if (problem == 3) {
            cout << "链表中结点的个数为:" << ListLength(L) << "个" << endl << endl;
        } else if (problem == 4) {
            int i, e;
            cout << "请输入取第结点的序号i" << endl;
            cin >> i;
            cout << "第"<<i<<"个结点为:" << GetElem(L, i, e) << endl << endl;
        } else if (problem == 5) {
            int e,k;
            cout << "请输入你要查找的结点e" << endl;
            cin >> e;
            cout<<"请选择你想要的关系:1(相等) 2(小于你输入的元素) 3(大于你输入的元素)"<<endl;
            cin>>k;
            if(k==1) {
                LocateElem(L, e, compare1);
                cout << endl;
            }
            else if(k==2){
                LocateElem(L, e, compare2);
                cout<<endl;
            }
            else {
                LocateElem(L, e, compare3);
                cout<<endl;
            }
            cout<<endl;
        } else if (problem == 6) {
            cout << "请输入结点数据e" << endl;
            int e, pre_e;
            cin >> e;
            PriorElem(L, e, pre_e);
            cout << endl;
        } else if (problem == 7) {
            cout << "请输入元素e" << endl;
            int e, next_e;
            cin >> e;
            NextElem(L, e, next_e);
            cout << endl;
        } else if (problem == 8) {
            cout << "请输入要删除结点的序号:i" << endl;
            int  i,e;
            cin >> i;
            DeleteElem(L, i,e);
            ListOut(L);
            cout << endl;
        } else if (problem == 9) {
            LinkList M,p,q,s;
            ListInit_L(M);
            q=(LinkList)malloc(sizeof(LNode));
            M->next=q;
            p=L->next;
            while(p){
                if(!p->next){
                    q->data=p->data;
                    p=p->next;
                }
                else {
                    q->data = p->data;
                    p = p->next;
                    s = (LinkList) malloc(sizeof(LNode));
                    q->next = s;
                    q = s;
                }
            }
            cout << "已经将单链表赋值给M单链表,下面打印M单链表" << endl;
            ListOut(M);
            cout << endl;
        } else if (problem == 10) {
            ClearList(L);
            cout << "已经清空,下面打印空表" << endl;
            ListOut(L);
            cout << endl;
        } else if (problem == 11) {
            CleanList(L);
            cout<<"重复值已经删除"<<"打印新的单链表"<<endl;
            ListOut(L);
        }
        else if(problem==12){
            cout<<"逆置单链表成功,打印逆置单链表"<<endl;
            converse(L);
            ListOut(L);
        }
        else if(problem==13){
            system("C:\\Users\\Woftc\\CLionProjects\\untitled22\\cmake-build-debug\\untitled22.exe");
        }
        else if(problem==14){
            srand(time(0));
            num=rand()%10+5;
            ListIn(L,num);
            ListOut(L);
        }
        problem = Menus();
    }
    return 0;
}

多项式运算

#include <stdio.h>
#include <malloc.h>
#include<iostream>
using namespace std;
#define MAX 2000            //多项式最多项数
typedef struct      //定义存放多项式的数组类型
{
    double coef;        //系数
    int exp;            //指数
} PolyArray;

typedef struct pnode    //定义单链表结点类型,保存多项式中的一项,链表构成多项式
{
    double coef;        //系数
    int exp;            //指数
    struct pnode *next;
} PolyNode;

void DispPoly(PolyNode *L)    //输出多项式
{
    bool first=true;        //first为true表示是第一项
    PolyNode *p=L->next;
    while (p!=NULL)
    {
        if (first)
            first=false;
        else if (p->coef>0)
            printf("+");
        if (p->exp==0)
            printf("%g",p->coef);
        else if (p->exp==1)
            printf("%gx",p->coef);
        else
            printf("%gx^%d",p->coef,p->exp);
        p=p->next;
    }
    printf("\n");
}

void DestroyList(PolyNode *&L)    //销毁单链表
{
    PolyNode *p=L,*q=p->next;
    while (q!=NULL)
    {
        free(p);
        p=q;
        q=p->next;
    }
    free(p);
}

void EmptyList(PolyNode *&L)
{
    PolyNode *p=L->next;
    if(p){
        cout<<"多项式不为空"<<endl;
    }
    else{
        cout<<"多项式为空"<<endl;
    }
}

void CreateListR(PolyNode *&L, PolyArray a[], int n) //尾插法建表
{
    PolyNode *s,*r;
    int i;
    L=(PolyNode *)malloc(sizeof(PolyNode));    //创建头结点
    L->next=NULL;
    r=L;                        //r始终指向终端结点,开始时指向头结点
    for (i=0; i<n; i++)
    {
        s=(PolyNode *)malloc(sizeof(PolyNode));//创建新结点
        s->coef=a[i].coef;
        s->exp=a[i].exp;
        r->next=s;                //将*s插入*r之后
        r=s;
    }
    r->next=NULL;                //终端结点next域置为NULL
}

void Sort(PolyNode *&head)        //按exp域递减排序
{
    PolyNode *p=head->next,*q,*r;
    if (p!=NULL)                //若原单链表中有一个或以上的数据结点
    {
        r=p->next;                //r保存*p结点后继结点的指针
        p->next=NULL;            //构造只含一个数据结点的有序表
        p=r;
        while (p!=NULL)
        {
            r=p->next;            //r保存*p结点后继结点的指针
            q=head;
            while (q->next!=NULL && q->next->exp>p->exp)
                q=q->next;        //在有序表中找插入*p的前驱结点*q
            p->next=q->next;    //将*p插入到*q之后
            q->next=p;
            p=r;
        }
    }
}

void Add(PolyNode *ha,PolyNode *hb,PolyNode *&hc)  //求两有序集合的并,完成加法
{
    PolyNode *pa=ha->next,*pb=hb->next,*s,*tc;
    double c;
    hc=(PolyNode *)malloc(sizeof(PolyNode));        //创建头结点
    tc=hc;
    while (pa!=NULL && pb!=NULL)
    {
        if (pa->exp>pb->exp)
        {
            s=(PolyNode *)malloc(sizeof(PolyNode));    //复制结点
            s->exp=pa->exp;
            s->coef=pa->coef;
            tc->next=s;
            tc=s;
            pa=pa->next;
        }
        else if (pa->exp<pb->exp)
        {
            s=(PolyNode *)malloc(sizeof(PolyNode));    //复制结点
            s->exp=pb->exp;
            s->coef=pb->coef;
            tc->next=s;
            tc=s;
            pb=pb->next;
        }
        else                //pa->exp=pb->exp
        {
            c=pa->coef+pb->coef;
            if (c!=0)        //系数之和不为0时创建新结点
            {
                s=(PolyNode *)malloc(sizeof(PolyNode));    //复制结点
                s->exp=pa->exp;
                s->coef=c;
                tc->next=s;
                tc=s;
            }
            pa=pa->next;
            pb=pb->next;
        }
    }
    if (pb!=NULL) pa=pb;    //复制余下的结点
    while (pa!=NULL)
    {
        s=(PolyNode *)malloc(sizeof(PolyNode));    //复制结点
        s->exp=pa->exp;
        s->coef=pa->coef;
        tc->next=s;
        tc=s;
        pa=pa->next;
    }
    tc->next=NULL;
}

void SUB(PolyNode *ha,PolyNode *hb,PolyNode *&hc)  //求两有序集合的并,完成减法
{
    PolyNode *pa=ha->next,*pb=hb->next,*s,*tc;
    double c;
    hc=(PolyNode *)malloc(sizeof(PolyNode));        //创建头结点
    tc=hc;
    while (pa!=NULL && pb!=NULL)
    {
        if (pa->exp>pb->exp)
        {
            s=(PolyNode *)malloc(sizeof(PolyNode));    //复制结点
            s->exp=pa->exp;
            s->coef=pa->coef;
            tc->next=s;
            tc=s;
            pa=pa->next;
        }
        else if (pa->exp<pb->exp)
        {
            s=(PolyNode *)malloc(sizeof(PolyNode));    //复制结点
            s->exp=pb->exp;
            s->coef=pb->coef;
            tc->next=s;
            tc=s;
            pb=pb->next;
        }
        else                //pa->exp=pb->exp
        {
            c=pa->coef-pb->coef;
            if (c!=0)        //系数之和不为0时创建新结点
            {
                s=(PolyNode *)malloc(sizeof(PolyNode));    //复制结点
                s->exp=pa->exp;
                s->coef=c;
                tc->next=s;
                tc=s;
            }
            pa=pa->next;
            pb=pb->next;
        }
    }
    if (pb!=NULL) pa=pb;    //复制余下的结点
    while (pa!=NULL)
    {
        s=(PolyNode *)malloc(sizeof(PolyNode));    //复制结点
        s->exp=pa->exp;
        s->coef=pa->coef;
        tc->next=s;
        tc=s;
        pa=pa->next;
    }
    tc->next=NULL;
}

int Menus(){
    int n;
    cout<<"1.判断多项式是否为空"<<endl;
    cout<<"2.将多项式A赋值给多项式D"<<endl;
    cout<<"3.多项式A+多项式B"<<endl;
    cout<<"4.多项式A-多项式B"<<endl;
    cout<<"5.设置多项式A为空多项式"<<endl;
    cout<<"6.随机生成多项式"<<endl;
    cout<<"0.退出计算"<<endl;
    cout<<"请输入序号:"<<endl;
    cin>>n;
    return n;
}
int main()
{
    int problem;
    cout<<"随机生成多项式a,b"<<endl;
    PolyNode *ha,*hb,*hc, *hd,*he ;
    PolyArray a[]= {{1.7,0},{2.9,1},{3.5,4},{-2.5,5}};
    PolyArray b[]= {{-1.2,0},{2.5,1},{3.2,3},{2.5,7},{5.4,10}};
    PolyArray e[]={{5.5,2},{3.7,3},{5.6,6},{8.9,8},{9.5,9},{8.6,10}};
    CreateListR(ha,a,4);
    CreateListR(hb,b,5);
    CreateListR(he,e,6);
    printf("原多项式A:   ");
    DispPoly(ha);
    printf("原多项式B:   ");
    DispPoly(hb);
    Sort(ha);
    Sort(hb);
    printf("有序多项式A: ");
    DispPoly(ha);
    printf("有序多项式B: ");
    DispPoly(hb);
    problem=Menus();
    while(problem){
        if(problem==1){
            EmptyList(ha);
        }
        else if(problem==2){
            hd=(PolyNode *)malloc(sizeof(PolyNode));
            hd->next=NULL;
            PolyNode *p=hd->next,*q=ha->next;
            while(q){
                p=(PolyNode *)malloc(sizeof(PolyNode));
                p->coef=q->coef;
                p->exp=q->exp;
                p=p->next;
                q=q->next;
            }
            cout<<"赋值完成,打印多项式D"<<endl<<endl;
            DispPoly(ha);
        }
        else if(problem==3){
            Add(ha,hb,hc);
            printf("多项式相加:  ");
            DispPoly(hc);
        }
        else if(problem==4){
            SUB(ha,hb,hc);
            printf("多项式相减:  ");
            DispPoly(hc);
        }
        else if(problem==5){
            cout<<"多项式A已经置空,打印多项式A"<<endl;
            ha->next=NULL;
            DispPoly(ha);
        }
        else if(problem==6){
            DispPoly(he);
            cout<<"排序后"<<endl;
            Sort(he);
            DispPoly(he);
        }
        problem=Menus();
    }
    DestroyList(ha);
    DestroyList(hb);
    DestroyList(hc);
    DestroyList(hd);
    return 0;
}