链式线性表——实验及提升训练

#include <stdio.h>
#include <stdlib.h>
struct node
{//链表结点类型,包含一个存放整型数据的 data 成员,和一个指向下一个结点的next成员
    int data ;
    struct node *next ;
};

struct node *mycreateList()
{//函数功能:创建一个只有一个头结点的空链表,头节点的数据域赋值为0,并将表头结点的地址返回
    struct node *head = (struct node *)malloc(sizeof(struct node));
    head->data = 0;
    head->next = NULL;
    return head;
}


void myinsertHead(struct node * head, int insData )
{
    /*函数功能:实现在head为表头的链表中使用头插法,插入数据元素insData*/
    struct node *p ;
    p = (struct node *)malloc(sizeof(struct node));
    p->data = insData;
    p->next = head->next ;
    head->next = p ;
}

void myinsertTail(struct node *  head , int insData )
{
    /*在head为表头的单链表表尾插入数据元素insData*/
    struct node *p ,*q ;
    p = (struct node *)malloc(sizeof(struct node));
    p->data = insData;
    p->next = NULL;
    q = head ;
    while(q->next!=NULL)
        q = q->next;
    q->next = p ;
}

void myprintList(struct node *L)
{
    /*输出head为表头的链表中的数据元素,每输出一个数据空一格*/
    struct node *p = L->next ;
    int cnt=0;
    while(p)
    {
    cnt++;
    p = p->next ;
    }
for (;cnt>0;cnt--){
    p=L->next;
    for (int tmp=cnt-1; tmp>0&&p->next!=NULL; p=p->next,tmp--) {}
        printf("%d ",p->data);
}
}
void genNumber( struct node *A , int num)
{//本函数用于接收输入的大数的各个位,返回大数链表表头,可使用上面已实现的链表插入函数
/*------begin---------*/
        int n;
    for (int i = 0; i < num; ++i) {
        scanf("%d",&n);
        myinsertHead(A,n);
    }

/*------end---------*/
}

struct node *addNumber(struct node *A ,struct node *B)
{
    //此处实现函数求两数相加,并返回和值链表的表头;
    /*------begin---------*/
    struct node *p,*q,*tmp;
    p=A->next;
    q=B->next;
    struct node *ans=(struct node *)malloc(sizeof(struct node));
    ans->next=NULL;
    tmp=ans;
    int flag=0;
    for(;p!=NULL&&q!=NULL;q=q->next,p=p->next){
        struct node *list=(struct node *)malloc(sizeof(struct node));
        list->next=NULL;
        list->data=p->data+q->data;
        if(flag){
            list->data=p->data+q->data+1;
            flag=0;
        }

        if(list->data>=10){
        flag=1;
        list->data=list->data%10;
        }
        tmp->next=list;
        tmp=tmp->next;
    }
    if(p!=NULL){
        q=p;
    }
    for(;q!=NULL;q=q->next){
        struct node *list=(struct node *)malloc(sizeof(struct node));
        list->next=NULL;
        list->data=q->data;
        if (flag){
            list->data+=1;
            flag=0;
        }
        if(list->data>=10){
            flag=1;
            list->data=list->data%10;
        }
        tmp->next=list;
        tmp=tmp->next;
    }
    return ans;

    /*------end---------*/
}
View Code
#ifndef _LAB1_H_
#define  _LAB1_H_
#include <stdlib.h>
#include <stdio.h>



//存放多项式某项的结点结构 
struct node
{
    int exp ;  // 表示指数
    int coef ; //表示系数
    struct node *next;  //指向下一个结点的指针
};

typedef  struct node * PNODE ;

/*
  函数功能:生成多项式
  函数名:createPoly
  函数参数:无
  返回值:指向多项式的头指针 
*/
PNODE createPoly(void)
{
    //在此处填写代码,能实现创建一个多项式并返回多项式头指针的函数
    //注意:头指针不存放多项式的项。
    /**********  Begin **********/
    PNODE head=(PNODE)malloc(sizeof(struct node));
    head->next=NULL;
    PNODE p=head;
    int e;
    int c;
    scanf("%d%d",&c,&e);
    for(;c!=0;){
        PNODE node=(PNODE)malloc(sizeof(struct node));
        node->exp=e;
        node->coef=c;
        node->next=NULL;
        p->next=node;
        p=p->next;
        // fflush(stdin);
        scanf("%d%d",&c,&e);
    }
    return head;

    /**********  End  **********/
}

/*
   函数功能:进行多项式相加
   函数名:addPoly
   函数参数:polyAddLeft :加法左边多项式头指针, polyAddRight:加法右边多项式头指针 
   返回值:指向结果多项式的头指针 
*/
PNODE addPoly(PNODE polyAddLeft , PNODE polyAddRight)
{
    //在此处填写代码,能实现创两个多项式相加并返回结果多项式头指针的函数
    /**********  Begin **********/
    PNODE ans=(PNODE)malloc(sizeof(struct node));
    ans->next=NULL;
    PNODE p,q;
    p=polyAddLeft->next;
    q=polyAddRight->next;
    PNODE n=ans;
    for(;p!=NULL&&q!=NULL;){

        if(q->exp>p->exp){
            PNODE node=(PNODE)malloc(sizeof(struct node));
            node->next=NULL;
            n->next=node;
            n=n->next;
            node->exp=p->exp;
            node->coef=p->coef;
            p=p->next;
            continue;
        } else if(q->exp<p->exp){
            PNODE node=(PNODE)malloc(sizeof(struct node));
            node->next=NULL;
            n->next=node;
            n=n->next;
            node->exp=q->exp;
            node->coef=q->coef;
            q=q->next;
            continue;
        } else{
            if(p->coef+q->coef!=0){
                PNODE node=(PNODE)malloc(sizeof(struct node));
                node->next=NULL;
                n->next=node;
                n=n->next;
                node->exp=q->exp;
                node->coef=q->coef+p->coef;
            }
                q=q->next;
                p=p->next;
        }

    }
    if(p!=NULL){
        q=p;
    }
    while(q!=NULL){
        PNODE node=(PNODE)malloc(sizeof(struct node));
        node->next=NULL;
        n->next=node;
        n=n->next;
        node->exp=q->exp;
        node->coef=q->coef;
        q=q->next;
    }
    return ans;
    /**********  End **********/
}

/*
   函数功能:输出多项式 
   函数名:printPoly
   函数参数:待输出多项式的头指针poly 
   返回值:无 
*/
void printPoly(PNODE poly)
{
    //在此处填写代码,能实现按格式输出多项式的功能,输出格式样例见说明
    /**********  Begin **********/
    PNODE p;
    p=poly->next;
    while(p!=NULL){
        printf("%dx^%d",p->coef,p->exp);

        if(p->next!=NULL){
            printf("+");
        }
        p=p->next;
    }

    /**********  End **********/
}

void destroyPoly(PNODE poly)
{
//释放存储多项式的链表空间
    PNODE q,p;
    p=q=poly;
    while(p!=NULL){
        p=p->next;
        free(q);
        q=p;
    }
    free(poly);
}
#endif
View Code
#ifndef _LINKSET_H_
#define _LINKSET_H_
#include <stdio.h>
#include <stdlib.h>

typedef int DataType;

struct  node
{
    DataType  element;
    struct node  *next;
};
typedef struct node * SET;
void insert(DataType datax, SET set);

/*
  函数名: InitSet
  函数功能:根据参数num,初始化集合
  函数参数:集合元素的个数 
  返回值:集合头指针 
*/
SET InitSet(int num)
{

    SET p;
    p = ( struct  node *)malloc(sizeof(struct node)) ;
    p->next = NULL;
    p->element = num;
    int temp;
    for(int i =0;i<num;i++)
    {
        scanf("%d",&temp);
        insert(temp, p); //调用insert函数,将输入数据插入集合
    }
    return p;
}


/*
  函数名: find
  函数功能:在集合中查找值为datax的成员 
  函数参数:datax:待查找的值 ; set:集合的头结点 
  返回值:找到值为datax的成员返回1,否则返回0 
*/
int find(DataType datax, SET  set)
{
    //请在此处填写代码,在set集合中查找值为datax的成员,若找到返回1,否则返回0
    /**********  Begin  **********/

    if(set==NULL){
        return 0;
    }
    SET p;
    p=set->next;
    while(p!=NULL){
        if(p->element==datax){
            return 1;
        }
        p=p->next;
    }
    return  0;
    /**********   End   **********/
}

/*
  函数名: insert
  函数功能:在集合set中插入值为datax的成员 ,插入位置在表头 
  函数参数:datax:待插入的值 ; set:集合的头结点 
  返回值:无 
  时间复杂度:O(1)
*/
void insert(DataType datax, SET set)
{
    //请在此处填写代码,将datax插入集合set, 注意因集合元素是无序的,只需将新成员插入表头
    /**********  Begin  **********/

    if(set->element<=0){
        return;
    }
    SET s=( struct  node *)malloc(sizeof(struct node)) ;
    s->element=datax;
    s->next=NULL;
    SET p=set;
    //p=p->next;
    while(p->next!=NULL){
        p=p->next;
    }

    p->next=s;

    /**********   End   **********/
}

/*
  函数名: copyList
  函数功能:将集合setA复制生成集合setB 
  函数参数:setA 、setB的头结点 
  返回值:无 
*/
void copySet(SET setA, SET setB)
{
    //请在此处填写代码,实现将集合setA的成员复制到集合setB的功能
    /**********  Begin  **********/
    if(setA==NULL){
        return;
    }
    SET p=setA->next;

    while (p->next!=NULL){
        insert(p->element,setB);
        setB->element++;
        p=p->next;
    }



    /**********   End   **********/
}

/*
  函数名: printSet
  函数功能:输出集合的元素,以空格作为元素之间分界符 
  函数参数:set的头结点 
  返回值:无 
*/
void printSet(SET set)
{
    //请在此处填写代码,实现输出集合元素的功能,元素之间以空格为分界符
    /**********  Begin  **********/
 SET p=set->next;
 while(p!=NULL){
     int n=p->element;
     printf("%d ",n);
     p=p->next;
 }

    /**********  End  **********/
}

/*
  函数名: setUnion
  函数功能:求两个集合setA 和 setB的并集 
  函数参数:setA和setB的头结点 
  返回值:并集集合的头结点 
*/
SET setUnion(SET setA ,SET setB)
{
    //请在此处填写代码,可直接使用上面已经实现的各操作
    /**********  Begin  **********/
    //copySet(setA,setB);
    SET p,q;
    p=setA;
    p=p->next;
    q=setB;
    q=q->next;
    SET ret=(SET)malloc(sizeof(struct node));
    ret->next=NULL;
    ret->element=0;
    SET tmp=ret;
        while (q!=NULL){//将B中非A元素放入链栈
            if(!find(q->element,setA)) {
                SET n = (SET) malloc(sizeof(struct node));
                n->element = q->element;
                n->next = NULL;
                ret->element++;
                tmp->next = n;
                tmp = tmp->next;
            }
                q = q->next;
        }
    while (p!=NULL){//将A所有(非链栈)元素放入链栈
        if(!find(p->element,ret)){
        SET n=(SET)malloc(sizeof(struct node));
        n->element=p->element;
        n->next=NULL;
        ret->element++;
        tmp->next=n;
        tmp=tmp->next;
        }
        p=p->next;
    }

    return ret;

    /**********  End  **********/
}

/*
  函数名: setIntersect
  函数功能:求两个集合setA 和 setB的交集 
  函数参数:setA和setB的头结点 
  返回值:交集集合的头结点 
*/
SET setIntersect(SET setA ,SET setB)
{
    //请在此处填写代码,可直接使用上面已经实现的各操作
    /**********  Begin  **********/
SET p,q,ans;


ans=( struct  node *)malloc(sizeof(struct node)) ;
    ans->next = NULL;
    ans->element=0;
p=ans;
        for (q=setB->next;q!=NULL;q=q->next){
    if(find(q->element,setA)){
        SET node=( struct  node *)malloc(sizeof(struct node)) ;
        node->element=q->element;
        node->next=NULL;
    p->next=node;
    p=p->next;
    ans->element++;
    }
        }
    return ans;
    /**********  End  **********/
}

/*
  函数名: setExcept
  函数功能:求两个集合setA 和 setB的差 
  函数参数:setA和setB的头结点 
  返回值:结果集合的头结点 
*/
SET setExcept(SET setA ,SET setB)
{
    //请在此处填写代码,可直接使用上面已经实现的各操作
    /**********  Begin  **********/
    SET p,q,ans;

//返回A有B无!!!
    ans=( struct  node *)malloc(sizeof(struct node)) ;
    ans->next = NULL;
    ans->element=0;
    p=ans;
    for (q=setA->next;q!=NULL;q=q->next){
        if(!find(q->element,setB)){
            SET node=( struct  node *)malloc(sizeof(struct node)) ;
            node->element=q->element;
            node->next=NULL;
            p->next=node;
            p=p->next;
            ans->element++;
        }
    }
    return ans;

    /**********  End  **********/
}

void destroySet(SET set)
{
//释放存储集合的链表空间,表头为set
SET p,q;
p=q=set;
while (p->next!=NULL){
    p=p->next;
    free(q);
    q=p;
}
//free(set);
}

#endif
View Code
原文地址:https://www.cnblogs.com/jeseesmith/p/13910262.html