小垃圾myl的课后实践

#include<iostream>
#include<cstdio>
using namespace std;
int main(){
    int y,m,d,ans=0,flag=0;
    printf("请输入年月日,并用逗号隔开\n");
    scanf("%d,%d,%d",&y,&m,&d);
    if((y%400==0)||((y%100!=0)&&(y%4==0)))flag=1;//判断是否为闰年 
    m--;
    switch(m){
        case 11:ans+=30;
        case 10:ans+=31;
        case 9:ans+=30;
        case 8:ans+=31;
        case 7:ans+=31;
        case 6:ans+=30;
        case 5:ans+=31;
        case 4:ans+=30;
        case 3:ans+=31;
        case 2:ans=ans+flag+28;
        case 1:ans+=31;
    }
    ans+=d;
    printf("这一天是这一年的第%d天\n",ans);
    return 0;
}
计算某一天是这一年的第几天

 模板类

//
// Created by Ma_Yiling on 2020/5/15.
//

#ifndef CLION_ARRAY_H
#define CLION_ARRAY_H
template<typename T>
class Array{
public:
    Array(int s);
    virtual ~Array();
    virtual const T &Entry(int index)const;
    virtual void Enter(int index,const T & value);
protected:
    int size;
    T *element;
};
template<typename T>
Array<T>::Array(int s){
    if(s>1)size=s;
    else size=1;
    element=new T[size];
}

template<typename T>
Array<T>::~Array(){
    delete []element;
}

template<typename T>
const T& Array<T>::Entry(int index)const{
    return element[index];
}

template<typename T>
void Array<T>::Enter(int index,const T &value){
    element[index]=value;
}
#endif //CLION_ARRAY_H
array.h
#include<iostream>
using namespace std;
#include"Array.h"
int main(){
    Array<int>IntAry(5);
    for(int i=0;i<5;i++)IntAry.Enter(i,i);
    cout<<"Integer Array:\n";
    for(int i=0;i<5;i++)cout<<IntAry.Entry(i)<<'\t';
    cout<<endl;
    Array<double>DouAry(5);
    for(int i=0;i<5;i++)DouAry.Enter(i,(i+1)*0.35);
    cout<<"Double Array:\n";
    for(int i=0;i<5;i++)cout<<DouAry.Entry(i)<<'\t';
    cout<<endl;
    return 0;
}
模板类

 

#include<iostream>
using namespace std;
template<typename T>
class Complex{
public:
    Complex(T r=0,T i=0):Real(r),Image(i){};
private:
    T Real,Image;
template<typename U>
friend Complex<U> operator + (const Complex<U>&c1,const Complex<U>&c2);

template<typename U>
friend Complex<U> operator - (const Complex<U>&c1,const Complex<U>&c2);

template<typename U>
friend Complex<U> operator - (const Complex<U>&c);

template<typename U>
friend ostream & operator << (ostream & output,const Complex<U>&c);
};
//-------------------------------------------------------------------------------
template<typename T>
Complex<T> operator + (const Complex<T>&c1,const Complex<T>&c2){
    T r=c1.Real+c2.Real;
    T i=c1.Image+c2.Image;
    return Complex<T>(r,i);
}

template<typename T>
Complex<T> operator - (const Complex<T>&c1,const Complex<T>&c2){
    T r=c1.Real-c2.Real;
    T i=c1.Image-c2.Image;
    return Complex<T>(r,i);
}

template<typename T>
Complex<T> operator - (const Complex<T>&c){
    return Complex<T>(-c.Real,-c.Image);
}

template<typename T>
ostream & operator << (ostream & output,const Complex<T>&c){
    output<<"("<<c.Real<<","<<c.Image<<")\n";
    return output;
}
//--------------------------------------------------------------------------------
int main(){
    Complex<double>c1(2.5,3.7),c2(4.2,6.5);
    cout<<"c1 = "<<c1<<"c2 = "<<c2;
    cout<<"c1 + c2 = "<<c1+c2;
    cout<<"c1 - c2 = "<<c1-c2;
    cout<<"-c1 = "<<-c1;
    return 0;
}
复数类用模板定义重载运算符 友元函数

 

#include<iostream>
using namespace std;
const double pi=3.14159;
template<typename T>class Circle{
private:
    T radius;
    static int total;
public:
    Circle(T r=0){radius = r;total++;}
    void Set_Radius(T r){radius = r;}
    double Get_Radius(){return radius;}
    double Get_Girth(){return 2*radius*pi;}
    double Get_Area(){return pi*radius*radius;}
    static int ShowTotal(){
        return total;
    }
};
template<typename T>int Circle<T>::total=0;
//template<typename T>
//int Circle<T>::ShowTotal(){return total;}
int main(){
    return 0;
}
静态数据成员

 

模板函数

#include <iostream>
using namespace std;
template<typename ElementType>
void SortBubble(ElementType *a,int size){
    int work;
    ElementType temp;
    for(int pass=1;pass<size;pass++){
        work=1;
        for(int i=0;i<size-pass;i++){
            if(a[i]>a[i+1]){
                temp=a[i];
                a[i]=a[i+1];
                a[i+1]=temp;
                work=0;
            }
        }
        if(work)break;
    }
}

template <typename ElementType>
void Print(ElementType *x,int n){
    for(int i=0;i<n;i++)
        printf("%d ",x[i]);
    puts("");
}

int main() {
    int n,a[15];
    scanf("%d",&n);
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    SortBubble(a,n);
    Print(a,n);
}
冒泡排序

 

#include<iostream>
using namespace std;
template<typename T>
T Max(const T a,const T b){return a>b?a:b;}
template<typename T>
T Max(const T a,const T b,const T c)
{T t=Max(a,b);return Max(t,c);}
int Max(const int a,const char b){return a>b?a:b;}
int main(){
    cout<<"Max(3,'a')is "<<Max(3,'a')<<endl;
    cout<<"Max(9.3,0.5)is "<<Max(9.3,0.5)<<endl;
    cout<<"Max(9,5,23)is "<<Max(9,5,23)<<endl;
    return 0;
}
模板函数的重载

 

重载运算符

#include<iostream>
#include<cstdio>
using namespace std;
class Complex{
    private:
        double real,image;
    public:
        Complex(){real=0;image=0;}
        Complex(double x){real=x;image=0;}
        Complex(double x,double y){real=x;image=y;}
        friend Complex operator -(const Complex & x);
        friend Complex operator +(const Complex & x,const Complex & y);
        friend Complex operator -(const Complex & x,const Complex & y);
        void show(){
            printf("( %.3f , %.3f )\n",real,image);
        }
}; 
Complex operator -(const Complex & x){
    Complex res;
    res.real=-x.real;
    res.image=-x.image;
    return res;
}
Complex operator -(const Complex & x,const Complex & y){
    Complex res;
    res.real=x.real-y.real;
    res.image=x.image-y.image;
    return res;
}
Complex operator +(const Complex & x,const Complex & y){
    Complex res;
    res.real=x.real+y.real;
    res.image=x.image+y.image;
    return res;
}
int main(){
    Complex a(1,2),b(1),c(5,7);
    Complex ans=-a+b-c-c;
    ans.show();
}
用友元函数重载运算符

 

#include<iostream>
#include<cstdio>
using namespace std;
class point{
    private:
        int x,y;
    public:
        point(int xx,int yy){x=xx;y=yy;}
        point(){x=0;y=0;}
        point operator ++();
        point operator ++(int);
        void show(){
            printf("( %d , %d )\n",x,y);
        }
}; 
point point::operator ++(){
    this->x++;
    this->y++;
    return *this;
}
point point::operator ++(int){
    this->x++;
    this->y++;
    return *this;
}
int main(){
    point a(1,2);
    ++a;a.show();
    a++;a.show();
}
成员函数自增
 #include<iostream>
#include<cstdio>
using namespace std;
class point{
    private:
        int x,y;
    public:
        point(int xx,int yy){x=xx;y=yy;}
        point(){x=0;y=0;}
        friend point operator ++(point &);
        friend point operator ++(point &,int);//int为伪参数,目的是将前置式和后置式区分开来 
        void show(){
            printf("( %d , %d )\n",x,y);
        }
}; 
point operator ++(point &a){
    a.x++;
    a.y++;
    return a;
}
point operator ++(point &a,int){
    a.x++;
    a.y++;
    return a;
}
int main(){
    point a(1,2);
    ++a;a.show();
    a++;a.show();
}
友元函数自增

 

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
class Name{
    private:
        char *pName;
        int size;
    public:
        Name(char *pN);
        Name(const Name &);
        Name& operator=(const Name &);
        void show(){
            printf("%s\n",pName);
        }
};
Name::Name(char *pN){
    pName=new char[strlen(pN)+1];
    if(pName!=0)strcpy(pName,pN);
    size=strlen(pN);
}
Name::Name(const Name & obj){
    pName=new char[strlen(obj.pName)+1];
    if(pName!=0)strcpy(pName,obj.pName);
    size=obj.size;
}
Name & Name::operator=(const Name & obj){
    delete []pName;
    pName=new char[strlen(obj.pName)+1];
    if(pName!=0)strcpy(pName,obj.pName);
    size=obj.size;
    return *this;
}
int main(){
    Name Obj1("zhangsan");
    Name Obj2=Obj1;
    Obj2.show();
    Name Obj3("NoName");
    Obj3.show();
    Obj3=Obj2=Obj1;
    Obj3.show();
}
重载赋值运算符(只能用成员函数)

 

#include<iostream>
#include<cstdio>
using namespace std;
class vector{
    private:
        int *v;
        int size;
    public:
        vector(int n){v=new int[n];size=n;}
        ~vector(){delete []v;size=0;}
        int & operator [] (int i){return v[i];}
};
int main(){
    vector a(5);
    a[2]=12;
    cout<<a[2]<<endl;
    cout<<a.operator[](2)<<endl;
}
重载下标运算符[]
#include<iostream>
using namespace std;
class F{
    public:
        double operator ()(double x,double y);
};
double F::operator ()(double x,double y){
    return x*x+y*y;
}
int main(){
    F f;
    cout<<f(5.2,2.5)<<endl;
    return 0;
}
重载函数调用符()

istream和ostream是C++的预定义流类

cin是istream的对象,cout是ostream的对象

运算符<<由ostream重载为插入操作,用于输出基本类型数据

运算符>>由istream重载为提取操作,用于输入基本类型数据

用友元函数重载<<和>>,输出和输入用户自定义的数据类型

重载的时候,形参作为实参的别名,而实参是cout,cout是类ostream的对象;同理,cin是istream的对象。

流插入和流提取运算符的重载返回的是流类引用,以符合原语义

#include<iostream>
#include<cstdlib>
using namespace std;
class vector{
public:
    vector(int size=1);
    ~vector();
    int & operator[](int i);
    friend ostream & operator<<(ostream & output,vector &);
    friend istream & operator>>(istream & input,vector &);
private:
    int *v;
    int len;
};
vector::vector(int size){
    if(size<=0||size>100){
        cout<<"The size of "<<size<<" is null!\n";
        exit(0);
    }
    v=new int[size];
    len=size;
}
vector::~vector(){
    delete[]v;
    len=0;
}
int & vector::operator[](int i){
    if(i>=0&&i<len)return v[i];
    cout<<"The subscript "<<i<<" is outside !\n";exit(0);
}
ostream & operator << (ostream & output,vector & ary){//output是cout的别名
    for(int i=0;i<ary.len;i++)output<<ary[i]<<" ";
    output<<endl;
    return output;
}
istream & operator >> (istream & input,vector & ary){
    for(int i=0;i<ary.len;i++)input>>ary[i];
    return input;
}
int main(){
    int k;
    cout<<"Input the length of vector A:\n";
    cin>>k;
    vector A(k);
    cout<<"Input the elements of vector A:\n";
    cin>>A;
    cout<<"Output the elements of vector A:\n";
    cout<<A;
    return 0;
}
重载<<和>>

类对象的类型转换可以由两种方式实现:构造函数、转换函数 

称为用户定义的类型转换或类类型转换,有隐式调用和显式调用方式

 带参数的构造函数不能把一个类类型转换成基本类型

类类型转换函数是一种特殊的成员函数,提供类对象之间显式类型转换的机制

 

 

 

 

类型转换函数有两种使用方式:

隐式使用 i=a

显示使用 i=a.operator int()

使用不同函数作类型转换函数:

int i=a;//用类型转换函数进行转换

X i=a;//用构造函数进行转换

重载指针转换运算符

注意函数没有指定返回值的类型,这是语法的要求,跟其他重载函数不一样的地方,要注意

 

operator T * ();
Array<T>::operator T *(){
    return list;
}

 

 

 

继承

静态成员在派生类中的调用:

#include<iostream>
using namespace std;
class B{
public:
    static void Add(){i++;}
    static int i;
    void out(){cout<<"static i="<<i<<endl;}
};
int B::i=0;
class D: private B{
public:
    void f(){
        i=5;
        Add();
        B::i++;
        B::Add();
    }
};
int main(){
    B x;D y;
    x.Add();
    x.out();
    y.f();
    cout<<"static i="<<B::i<<endl;
    cout<<"static i="<<x.i<<endl;
    // cout<<"static i="<<y.i<<endl;
    return 0;
}
View Code

派生类的初始化

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
class parent_class{
private:
    int data1,data2;
public:
    parent_class(int p1,int p2){data1=p1;data2=p2;}
    int inc1(){return ++data1;}
    int inc2(){return ++data2;}
    void display(){cout<<"data1="<<data1<<",data2="<<data2<<endl;}
};
class derived_class:private parent_class{
private:
    int data3;
    parent_class data4;
public:
    derived_class(int p1,int p2,int p3,int p4,int p5):
        parent_class(p1,p2),data4(p3,p4),data3(p5){}
    int inc1(){return parent_class::inc1();}
    int inc3(){return ++data3;}
    void display(){
        parent_class::display();
        data4.display();
        cout<<"data3="<<data3<<endl;
    }
};
int main(){
    derived_class d1(17,18,1,2,-5);
    d1.inc1();
    d1.display();
    return 0;
}
派生类的初始化

 

 

 

 

 

 

 

 

 

 

 

排序

/*
    题目:选择排序
    作者:thmyl
    日期:2019-10-17 
*/ 
#include<iostream>
#include<cstdio>
#define maxn 1010
using namespace std;
int n,a[maxn];
int main(){
    printf("请输入数字的个数:");
    scanf("%d",&n);
    printf("请输入需要排序的数字:\n");
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            if(a[i]>a[j])swap(a[i],a[j]);
        }
    }
    printf("排好序后的数列为:\n");
    for(int i=1;i<=n;i++)printf("%d ",a[i]);
    puts("");
    return 0;
}
选择排序

 

/*
    题目:冒泡排序
    作者:thmyl
    日期:2019-10-17 
*/
#include<iostream>
#include<cstdio>
#define maxn 1010
using namespace std;
int n,a[maxn];
int main(){
    printf("请输入数字的个数:");
    scanf("%d",&n);
    printf("请输入需要排序的数字:\n");
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)
        for(int j=n;j>i;j--)//从后向前浮动 
            if(a[j]<a[j-1])swap(a[j],a[j-1]);
    printf("排好序后的数列为:\n");
    for(int i=1;i<=n;i++)printf("%d ",a[i]);
    puts("");
    return 0;
}
冒泡排序

 

/*
    ìa??:2???±??-DòáDμ??3Dò£?ê?3???óDDòêyáD
    ×÷??:thmyl
    è??ú:2019-10-18 
*/
#include<iostream>
#include<cstdio>
#define maxn 1010
using namespace std;
int a[maxn],n,mn,mark;
int *p[maxn];
bool vis[maxn];
int main(){
    printf("请输入数字的个数:");
    scanf("%d",&n);
    printf("请输入需要排序的数字:\n");
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=1;i<=n;i++){//?°?òμúi′óμ?êy 
        mn=0x7fffffff;
        for(int j=1;j<=n;j++)
            if(a[j]<mn&&!vis[j])
                mn=a[j],mark=j;
        p[i]=&a[mark];
        vis[mark]=1;
    }
    printf("排好序后的数列为:\n");
    for(int i=1;i<=n;i++)printf("%d ",*p[i]);
    puts("");
    return 0;
}
用指针排序
#include<iostream>
#include<cstdio>
#define maxn 100010
using namespace std;
int n,a[maxn],b[maxn];
void Sort(int l,int r){
    if(l==r)return;
    int mid=(l+r)>>1;
    Sort(l,mid);
    Sort(mid+1,r);
    int i=l,j=mid+1;
    int cnt=l-1;
    while(i<=mid&&j<=r){
        if(a[i]<=a[j]){
            b[++cnt]=a[i++];
        }
        else b[++cnt]=a[j++];
    }
    while(i<=mid)b[++cnt]=a[i++];
    while(j<=r)b[++cnt]=a[j++];
    for(int i=l;i<=r;i++)a[i]=b[i];
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    Sort(1,n);
    for(int i=1;i<=n;i++)printf("%d ",a[i]);
    puts("");
    return 0;
}
归并排序

 

指针

int *a[10]:定义了10个指向整型元素的指针

int (*a)[10]:定义了一个指针,指向一个有10个整型元素的数组

#include<iostream>
#include<cstdio>
using namespace std;
int b[10][10];
int (*a)[10];
int main(){
    int cnt=0;
    for(int i=0;i<10;i++)
        for(int j=0;j<10;j++){
            b[i][j]=cnt;
            cnt++;
        }
    a=b;
    for(int i=0;i<10;i++,a++){
        for(int *p=*a,j=0;j<10;j++,p++){
            printf("%d ",*p);
        }
        puts("");
    }
    return 0;
}
用(*a)[10]指向二维数组的用法

(2019.10.24)

#include<iostream>
#include<cstdio>
using namespace std;
const int N=10;
void input(int *a,int N){//事实上没有定义数组,而是传递了数组的地址,设a[]或*a都可以,用法相同 
    for(int i=0;i<N;i++)scanf("%d",&a[i]);
}
void index(int *a,int N){
    for(int i=0;i<N;i++)
        for(int j=i+1;j<N;j++)
            if(a[i]>a[j])swap(a[i],a[j]);
}
void output(int *a,int N){
    for(int i=0;i<N;i++)printf("%d ",a[i]);
}
int main(){
    freopen("Cola.txt","r",stdin);
    int a[N];
    input(a,N);
    index(a,N);
    output(a,N);
    return 0;
}
函数的参数传递(数组)

 

#include<iostream>
#include<cstdio>
using namespace std;
const int N=10;
int main(){
    int a[N];
    void input(int *a,int N);
    void index(int *a,int N);
    void output(int *a,int N);
    input(a,N);
    index(a,N);
    output(a,N);
    return 0;
}
void input(int *a,int N){//事实上没有定义数组,而是传递了数组的地址,设a[]或*a都可以,用法相同 
    for(int i=0;i<N;i++)scanf("%d",&a[i]);
}
void index(int *a,int N){
    for(int i=0;i<N;i++)
        for(int j=i+1;j<N;j++)
            if(a[i]>a[j])swap(a[i],a[j]);
}
void output(int *a,int N){
    for(int i=0;i<N;i++)printf("%d ",a[i]);
}
事先声明函数
#include<iostream>
#include<cstdio>
#define N 10
using namespace std;
int main(){
    int a,b,c;
    scanf("%d%d",&a,&b);
    #ifdef N
        c=a+b;
    #else 
        c=a-b;
    #endif
    printf("%d",c);
    return 0;
}
#ifdef
//这里的if后面的条件必须宏定义
#include<iostream>
#include<cstdio>
using namespace std;
int a,b;
int main(){
    scanf("%d",&a);
    #if(a>0)//Error
        b=a;
    #else 
        b=-a;
    #endif
    printf("%d\n",b);
    return 0;
}
#if
//不要输出一个一个的数,要先组成一个数然后再输出。
//据说某sp考试能检测你的输出方式,嗯哼哼?
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
    int i=0,n,a[5],sum=0;
    printf("Please input a number in 5 single numbers:\n");
    scanf("%d",&n);
    while(n){
        a[i]=n%10;
        n/=10;
        i++;
    }
    for(int i=0;i<5;i++)
        for(int j=i+1;j<5;j++)
            if(a[j]>a[i])swap(a[i],a[j]);
    printf("The largest number is:");
    for(int i=0;i<5;i++){
        sum=sum*10+a[i];
    }
    printf("%d\n",sum);
    printf("The smallest number is:");
    i=4;
    while(a[i]==0)i--;
    swap(a[4],a[i]);
    sum=0;
    for(int i=4;i>=0;i--){
        sum=sum*10+a[i];
    }
    printf("%d\n",sum);
    return 0;
}
输入一个5位数,输出其组合的最大数和最小数

 

(2019.10.25)

标准输入输出

/*scanf*/
%f   float
%lf  double
%Lf  long double


/*printf*/
%f   float/double
%Lf  long double
浮点数

 

malloc和free函数

malloc:

int *p;

p=(int*)malloc(sizeof(int)*100);

 

#include<iostream>
#include<cstdio>
#include<malloc.h>
#include<algorithm>
using namespace std;
int *p,n;
int main(){
    freopen("Cola.txt","r",stdin);
    scanf("%d",&n);
    p=(int*)malloc(sizeof(int)*(n+1));
    for(int i=1;i<=n;i++)scanf("%d",&p[i]);
    sort(p+1,p+n+1);
//    free(p);
    for(int i=1;i<=n;i++)printf("%d ",p[i]);
    puts("");
    free(p);
    return 0;
} 
malloc&free

 

#include<iostream>
#include<cstdio>
#include<cstdlib>
struct node{
    int data;
    node *next;
};
int main(){
    int i,j,k,m,n;
    node *h,*p,*q;
    scanf("%d%d",&n,&m);
    h=(node*)malloc(sizeof(node));
    h->data=1;
    h->next=h;
    p=h;
    for(i=2;i<=n;i++){
        q=(node*)malloc(sizeof(node));
        q->data=i;
        q->next=p->next;
        p->next=q;
        p=q;
    }
    p=h;
    k=1;//µ±Ç°Ëù±¨µÄÊý 
    while(p->next!=p){
        if(k<m-1){
            k++;
            p=p->next;
        }
        else if(k==m-1){
            q=p->next;
            p->next=p->next->next;
            printf("%d--",q->data);
            free(q);
            k=1;
            p=p->next;
        }
    }
    printf("%d\n",p->data);
    return 0;
}
malloc、结构体和指针实现约瑟夫环

 

#include<iostream>
#include<cstdio>
#include<malloc.h>
using namespace std;
int n;
struct Tree{
    int data,v;
    Tree *lson;
    Tree *rson;
};
Tree *p,*root;
void Insert(int x){
    Tree *q;
//    q=(Tree*)malloc(sizeof(Tree));
    q=root;
    while(1){
        if((p->v)>=(q->v)){
            if(q->rson==NULL){
                q->rson=p;
                return;
            }
            else {
                q=q->rson;
            }
        }
        else {
            if(q->lson==NULL){
                q->lson=p;
                return;
            }
            else {
                q=q->lson;
            }
        }
    }
}
void dfs(Tree *q){
    printf("%d ",q->v);
    if(q->lson!=NULL)
        dfs(q->lson);
    if(q->rson!=NULL)
        dfs(q->rson);
}
int main(){
    freopen("Cola.txt","r",stdin);
    int x;
    scanf("%d",&n);
    root=(Tree*)malloc(sizeof(Tree));
    scanf("%d",&x);
    root->data=1;
    root->v=x;
    root->lson=NULL;
    root->rson=NULL;
    for(int i=2;i<=n;i++){
        scanf("%d",&x);
        p=(Tree*)malloc(sizeof(Tree));
        p->data=i;
        p->v=x;
        p->lson=NULL;
        p->rson=NULL;
        Insert(x);
    }
    dfs(root);
    return 0;
}
malloc、结构体和指针实现二叉排序树

(2019.11.21)

链表

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<malloc.h>
  4 using namespace std;
  5 struct node{
  6     int data;
  7     node* next;
  8 };
  9 node* head=NULL;
 10 bool creat_node_list(){
 11     head=(node*)malloc(sizeof(node));
 12     if(NULL==head)return false;
 13     else {
 14         head->data=0;
 15         head->next=NULL;
 16         return 1;
 17     }
 18 }
 19 bool Insert(node* point){
 20     if(NULL==head)return 0;
 21     node* p=head->next;
 22     node* q=head;
 23     while(p!=NULL){
 24         q=p;
 25         p=p->next;
 26     } 
 27     q->next=point;
 28     point->next=NULL;
 29     return 1;
 30 }
 31 void reverse_list(){
 32     if(head==NULL)return;
 33     if(head->next==NULL)return;
 34     node* p=head->next;
 35     node* q=p->next;
 36     node* t=NULL;
 37     while(q!=NULL){
 38         t=q->next;
 39         q->next=p;
 40         p=q;
 41         q=t;
 42     }
 43     head->next->next=NULL;
 44     head->next=p;
 45 }
 46 void sort(){
 47     node* Head=head;
 48     if(head==NULL)return;
 49     if(Head->next==NULL)return;
 50     node* pi=Head->next;
 51     node* pj=pi->next;
 52     for(;pi!=NULL;pi=pi->next){
 53         for(pj=pi->next;pj!=NULL;pj=pj->next){
 54             if(pj->data>pi->data)
 55             swap(pj->data,pi->data);
 56         }
 57     }
 58 }
 59 bool deletenode(int id){
 60     if(head==NULL)return 0;
 61     node* p=head->next;
 62     int len=0;
 63     while(p!=NULL){
 64         len++;
 65         p=p->next;
 66     }
 67     if(len<id)return 0;
 68     else {
 69         node* q=head;
 70         p=head;
 71         for(int i=0;i<id;i++){
 72             q=p;
 73             p=p->next;
 74         }
 75         node* t=p->next;
 76         q->next=t;
 77         free(p);
 78         return 1;
 79     }
 80 }
 81 void destorylist(){
 82     if(head==NULL)return;
 83     if(head->next==NULL){
 84         free(head);
 85         head=NULL;
 86         return;
 87     }
 88     node* p=head->next;
 89     while(NULL!=p){
 90         node* tmp=p;
 91         p=p->next;
 92         free(tmp);
 93     }
 94     free(head);
 95     head=NULL;
 96 }
 97 void check(){
 98     if(head==NULL){
 99         puts("序列中没有任何元素");
100         return;
101     }
102     else if(head->next==NULL){
103         printf("%d\n",head->data);
104         return;
105     }
106     else {
107         node* p=head;
108         node* q=p->next;
109         while(p->next!=NULL){
110             printf("%d ",p->data);
111             p=q;
112             q=q->next;
113         }
114         printf("%d ",p->data);
115         puts("");
116     }
117     
118 }
119 int main(){
120     creat_node_list();
121     printf("%d\n",head->data);
122     node* node1=(node*)malloc(sizeof(node));
123     node1->data=1;
124     node1->next=NULL;
125     
126     node* node2=(node*)malloc(sizeof(node));
127     node2->data=2;
128     node2->next=NULL;
129     
130     Insert(node1);
131     Insert(node2);
132     check();
133     
134     reverse_list();
135     check();
136     
137     node* node3=(node*)malloc(sizeof(node));
138     node3->data=3;
139     node3->next=NULL;
140     
141     Insert(node3);
142     sort();
143     check();
144     deletenode(2);
145     check();
146     destorylist();
147     
148     return 0;
149 }
链表基本操作

 

#include<iostream>
#include<cstdio>
#include<malloc.h>
using namespace std;
struct list{
    int data;
    list* next;
};
list* head=NULL;
void creat_list(){
    head=(list*)malloc(sizeof(list));
    if(head==NULL)return;
    else {
        head->data=0;
        head->next=NULL;
    }
}
list* Insert(list* h,int x){
    if(h==NULL||h->next==NULL){
        list* p;
        p=(list*)malloc(sizeof(list));
        p->data=x;
        p->next=NULL;
        h->next=p;
        return h;
    }
    if(head->next->data>=x){//x插到第一个位置 
        list* p;
        p=(list*)malloc(sizeof(list));
        p->data=x;
        p->next=h->next;
        h->next=p;
        return h;
    }
    else {
        list* q=h->next;
        list* p=q->next;
        list* t;
        bool flag=0;//标记是否插入成功 
        while(p!=NULL){
            if(p->data>=x&&q->data<x){
                flag=1;
                t=(list*)malloc(sizeof(list));
                t->data=x;
                t->next=p;
                q->next=t;
                break;
            }
            q=p;
            p=p->next;
        }
        if(!flag){
            t=(list*)malloc(sizeof(list));
            t->data=x;
            t->next=NULL;
            q->next=t;
        }
        return h;
    }
}
list* remove(list* h,int x){
    list* q=head->next;
    if(q->data==x){
        h->next=q->next;
        free(q);
        return h;
    }
    if(q->next==NULL){
        free(q);
        head->next=NULL;
        return h;
    }
    list* p=q->next;
    while(p!=NULL){
        if(p->data==x){
            q->next=p->next;
            free(p);
            return h;
        }
        q=p;
        p=p->next;
    }
}
void check(){
    list* p=head->next;
    while(p!=NULL){
        printf("%d ",p->data);
        p=p->next;
    }
    puts("");
}
int main(){
    freopen("Cola.txt","r",stdin);
    int n,x;
    puts("请输入整数的个数:");
    scanf("%d",&n);
    creat_list();
    puts("请输入要排序的数列:");
    for(int i=1;i<=n;i++){
        scanf("%d",&x);
        Insert(head,x);
        check();
    }
    puts("请输入要删除的数的个数:");
    scanf("%d",&n);
    puts("请依次输入要删除的数");
    for(int i=1;i<=n;i++){
        scanf("%d",&x);
        remove(head,x);
        check();
    }
    return 0;
}
指针链表实现序列插入、删除

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<malloc.h>
#define Abs(x) ((x)>=0?(x):(-x))
using namespace std;
struct node{
    int a,b;//系数为a,指数为b 
    node* next;
};
node *head[4];
void creat_node(node* &h){
    h=(node*)malloc(sizeof(node));
    if(h==NULL)return;
    else{
        h->a=0;
        h->b=0;
        h->next=NULL;
        return;
    }
}
void Insert(node* &h,int x,int y){
    if(h==NULL||h->next==NULL){
        node *q;
        q=(node*)malloc(sizeof(node));
        q->a=x;
        q->b=y; 
        q->next=NULL;
        h->next=q;
        return;
    }
    else {
        node* p=h->next;
        node* q=h;
        node* t;
        t=(node*)malloc(sizeof(node));
        t->a=x;
        t->b=y;
        t->next=NULL;
        while(p!=NULL){
            q=p;
            p=p->next;
        }
        q->next=t;
        return;
    }
}
void reverse(node* &h){//把链表反转 
    if(h==NULL||h->next==NULL)return;
    node* p=h->next;
    node* q=h;
    node* t;
    bool flag=0;//判断是否是链表的第一个元素 
    while(p!=NULL){
        t=p->next;
        if(!flag)p->next=NULL,flag=1;
        else p->next=q;
        q=p;
        p=t;
    }
    h->next=q;
}
void calc1(node* &h1,node* &h2,node* &h3){
    creat_node(h3);
    node* p1=h1->next;
    node* p2=h2->next;
    node* p3;
    node* q=h3;
    while(p1!=NULL&&p2!=NULL){
        int x=(p1->a)+(p2->a);
        if(x!=0){
            p3=(node*)malloc(sizeof(node));
            p3->a=x;
            p3->b=p1->b;
            p3->next=NULL;
            q->next=p3;
            q=p3;
        }
        p1=p1->next;
        p2=p2->next;
    }
    while(p1!=NULL){//易错!不能把p1直接赋值给q,否则head[3]链表会有一部分指向head[2]链表,链表之间失去独立性 
        p3=(node*)malloc(sizeof(node));
        p3->a=p1->a;
        p3->b=p1->b;
        p3->next=p1->next;
        q->next=p3;
        q=q->next;
        p1=p1->next;
    }
    while(p2!=NULL){
        p3=(node*)malloc(sizeof(node));
        p3->a=p2->a;
        p3->b=p2->b;
        p3->next=p2->next;
        q->next=p3;
        q=q->next;
        p2=p2->next;
    }
}
void calc2(node* &h1,node* &h2,node* &h3){
    creat_node(h3);
    node* p1=h1->next;
    node* p2=h2->next;
    node* p3;
    node* q=h3;
    while(p1!=NULL&&p2!=NULL){
        int x=(p1->a)-(p2->a);
        if(x!=0){
            p3=(node*)malloc(sizeof(node));
            p3->a=x;
            p3->b=p1->b;
            p3->next=NULL;
            q->next=p3;
            q=p3;
        }
        p1=p1->next;
        p2=p2->next;
    }
    while(p1!=NULL){
        p3=(node*)malloc(sizeof(node));
        p3->a=p1->a;
        p3->b=p1->b;
        p3->next=p1->next;
        q->next=p3;
        q=q->next;
        p1=p1->next;
    }
    while(p2!=NULL){
        p3=(node*)malloc(sizeof(node));
        p3->a=-(p2->a);
        p3->b=p2->b;
        p3->next=p2->next;
        q->next=p3;
        q=q->next;
        p2=p2->next;
    }
}
void check(node* &h){
    if(h==NULL||h->next==NULL)return;
    node* q=h->next;
    bool flag=0;
    while(q->next!=NULL){
        if(!flag)printf("%d*x^%d",q->a,q->b),flag=1;
        else printf("%d*x^%d",Abs(q->a),q->b);
        if(q->next->a>0)printf(" + ");
        else printf(" - ");
        q=q->next;
    }
    if(q!=NULL)printf("%d*x^%d\n",Abs(q->a),q->b);
}
int main(){
    freopen("Cola.txt","r",stdin);
    int n,x;
    creat_node(head[1]);
    creat_node(head[2]);
    //------------------------------------------------- 
    puts("请输入第一个多项式的项数:");
    scanf("%d",&n);
    puts("请依次输入每一项的系数:");
//    creat_node(head[1]);
    for(int i=n-1;i>=0;i--){
        scanf("%d",&x);
        Insert(head[1],x,i);
    }
//    check(head[1]); 
    reverse(head[1]); 
//    check(head[1]);
    //-------------------------------------------------- 
    puts("请输入第二个多项式的项数:");
    scanf("%d",&n);
    puts("请依次输入每一项的系数:");
//    creat_node(head[2]);
    for(int i=n-1;i>=0;i--){
        scanf("%d",&x);
        Insert(head[2],x,i);
    }
//    check(head[2]);
    reverse(head[2]);
//    check(head[2]);
    //---------------------------------------------------- 
    puts("两多项式之和为:");
    calc1(head[1],head[2],head[3]);//加法运算 
    reverse(head[3]);
    check(head[3]);
    free(head[3]);
    //----------------------------------------------------- 
    puts("两多项式之差为:");
    calc2(head[1],head[2],head[3]);//减法运算 
    reverse(head[3]);
    check(head[3]);
    
    return 0;
}
链表实现多项式加减法
posted @ 2019-10-10 15:41  Echo宝贝儿  阅读(292)  评论(3编辑  收藏  举报