zoukankan      html  css  js  c++  java
  • 单链表实现AB操作

    #include<stdio.h>
    #include<malloc.h>
    #include<stdlib.h>
    
    #define ListSize 100
    
    typedef int DataType;
    
    typedef struct Node
    {
     DataType data;
     struct Node *next;
    }ListNode, *LinkList;
    
    
    /*******************************************************************************
    函数名:InitList(LinkList *head)
    函数功能:单链表的初始化操作
    入口参数:
    出口参数:
    ********************************************************************************/
    void InitList(LinkList *head)
    {
    /*将单链表初始化为空,动态生成一个头结点,并将
    头结点的指针域置为空*/
     if((*head=(LinkList)malloc(sizeof(ListNode)))==NULL)/*为头结点分配
      一个存储空间*/
      exit(-1);
     (*head)->next=NULL;/*将单链表的头结点指针域置为空*/
    }
    
    
    /*******************************************************************************
    函数名:ListEmpty(LinkList head)
    函数功能:判断单链表是否为空
    入口参数:
    出口参数:
    ********************************************************************************/
    int ListEmpty(LinkList head)
    {
    /*判断单链表是否为空,就是通过判断头结点的指针域
    是否为空*/
     if(head->next==NULL)/*判断单链表的头结点的指针域是否为空*/
      return 1;/*当单链表为空时,返回1,否则返回0*/
     else 
      return 0;
    }
    
    /*******************************************************************************
    函数名:         *Get(LinkList head, int i)
    函数功能:  按序号查找操作
    入口参数: 
    出口参数:
    ********************************************************************************/
    ListNode *Get(LinkList head, int i)
    {
    /*查找单链表中第i个结点。查找成功返回该结点的指针表示成
    功,否则返回NULL表示失败*/
     ListNode *p;
     int j;
     
     if(ListEmpty(head))/*在查找第i个元素之前,判断链表是否
      为空*/
      return NULL;
     
     if(i<1)/*在查找第i个元素之前,判断该序号是否合法*/
      return NULL;
     
     j=0;
     p=head;
     
     while(p->next != NULL && j<i)
      {
       p=p->next;
       j++;
      }
     if(j==i)/*查到第i个结点,返回指针p*/
      return p;
     else
      return NULL;/*如果没有找到第i个元素,返回NULL*/
    }
    
    
    /*******************************************************************************
    函数名:        *LocateElem(LinkList head, DataType e)
    函数功能:  按内容查找操作
    入口参数: 
    出口参数:
    ********************************************************************************/
    ListNode *LocateElem(LinkList head, DataType e)
    {
    /*查找线性表中元素值为e的元素,查找成功将对应元素
    的结点指针返回,否则返回NULL表示失败*/
     ListNode *p;
     p=head->next;/*指针p指向第一个结点*/
     while(p)
      {
       if(p->data!=e)
        p=p->next;
       else
        break;/*如果等于e的话推出*/
      }
     return p;
    }
    
     
    
    /*******************************************************************************
    函数名:        LocatePos(LinkList head,DataType e)
    函数功能:  定位操作
    入口参数: 
    出口参数:
    ********************************************************************************/
    int LocatePos(LinkList head,DataType e)
    {
    /*查找线性表中元素值为e的元素,查找成功将对应元素
    的序号返回,否则返回0表示失败*/
     ListNode *p;
     int i;
     if(ListEmpty(head))/*查找第i个元素之前判断链表是否为空*/
      return 0;
     p=head->next;/*指针p指向第一个结点*/
     i=1;
     while(p)
      {
       if(p->data==e)/*找到与e相等的元素,返回该序号*/
        return i;
       else
        {
         p=p->next;
         i++;
        }
      }
     if(!p) /*如果没有找到与e相等的元素,返回0表示失败*/
      return 0;
    }
    
    
    /*******************************************************************************
    函数名:   InsertList(LinkList head, int i, DataType e)
    函数功能:  插入操作
    入口参数: 
    出口参数:
    ********************************************************************************/
    int InsertList(LinkList head, int i, DataType e)
    {
    /*在单链表中第i个位置插入一个结点,结点元素值为e,插入
    成功返回1,否则失败返回0*/
     ListNode *p,*pre;/*定义指向第i个元素的前驱结点指针pre
    指针p指向新生成的结点*/
     int j;
     pre=head;/*指针p指向头结点*/
     j=0;
     while(pre->next != NULL && j<i-1)/*找到第i-1个结点,即第i个结点的
      前驱结点*/
      {
       pre=pre->next;
       j++;
      }
     if(j!=i-1)
      {
       printf("插入位置错");
       return 0;
      }
     /*新生成一个结点,并将e值赋给改结点的数据域*/
     if((p=(ListNode *)malloc(sizeof(ListNode)))==NULL)
      exit(-1);
     p->data=e;
     /*插入结点操作*/
     p->next=pre->next;
     pre->next=p;
     return 1;
    }
    
    
    /*******************************************************************************
    函数名:  DeleteList(LinkList head, int i, DataType *e)
    函数功能:  删除操作
    入口参数: 
    出口参数:
    ********************************************************************************/
    int DeleteList(LinkList head, int i, DataType *e)
    {
    /*删除单链表中的第i个位置的结点。删除成功返回1,失败返回
    0*/
     ListNode *pre,*p;
     int j;
     pre=head;
     j=0;
     while(pre->next !=NULL && pre->next->next !=NULL && j<i-1)
      {
       pre=pre->next;
       j++;
      }
     if(j!=i-1)
      {
       printf("删除位置错误");
       return 0;
      }
     /*指针p指向单链表中的第i 个结点,并将该结点的数据域
     值赋给e*/
     p=pre->next;
     *e=p->data;
     /*将前驱结点的指针域指向要删除结点的下一个结点,也
     就是将p指向的结点与单链表断开*/
     pre->next=p->next;
     free(p);/*释放p指向的结点*/
     return 1;
    }
    
    
    /*******************************************************************************
    函数名: ListLength(LinkList head)
    函数功能: 查表长度操作
    入口参数: 
    出口参数:
    ********************************************************************************/
    int ListLength(LinkList head)
    {
     ListNode *p;
     int count=0;
     p=head;
     while(p->next != NULL)
      {
       p=p->next;
       count++;
      }
     return count;
    }
    
    
    /*******************************************************************************
    函数名: DestroyList(LinkList head)
    函数功能: 销毁链表操作
    入口参数: 
    出口参数:
    ********************************************************************************/
    void DestroyList(LinkList head)
    {
     ListNode *p,*q;
     p=head;
     while(p != NULL)
      {
       q=p;
       p=p->next;
       free(q);
      }
    }
    
     
    
     
    
     
    
     
    
    #include"LinkList.h"
    
    /*******************************************************************************
    函数名:DelElem(LinkList A,LinkList B)
    函数功能:实现A-B操作
    入口参数:
    出口参数:
    ********************************************************************************/
    void DelElem(LinkList A,LinkList B)
    {
     int i,pos;
     DataType e;
     ListNode *p;
     /*在单链表B中,取出每个元素与单链表A中的元素比较
     如果相等则删除A中元素对应的结点*/
     for(i=1; i<=ListLength(B); i++)
      {
       p=Get(B, i);
       if(p)
        pos=LocatePos(A, p->data);
       if(pos>0)
        DeleteList(A, pos, &e);
      }
    }
    
    /*******************************************************************************
    函数名:main()
    函数功能:主函数
    入口参数:
    出口参数:
    ********************************************************************************/
    void main()
    {
     int i;
     DataType a[]={2,3,6,7,9,14,56,45,65,67};
     DataType b[]={3,4,7,11,34,54,45,67};
     
     LinkList A,B;/*声明单链表A和B*/
     ListNode *p;
     
     InitList(&A);/*初始化单链表A*/
     InitList(&B);/*初始化单链表B*/
    
     for(i=1; i<=sizeof(a) / sizeof(a[0]); i++)
      {
       if(InsertList(A, i, a[i-1])==0)
        {
         printf("位置不合法");
         return;
        }
      }
     for(i=1; i<=sizeof(b) / sizeof(b[0]); i++)
      {
       if(InsertList(B, i, b[i-1])==0)
        {
         printf("位置不合法");
         return;
        }
      }
     printf("单链表A中的元素有%d个:\n",ListLength(A));
     for(i=1; i<=ListLength(A); i++)
      {
       p=Get(A,i);
       if(p)
        printf("%4d",p->data);
      }
     printf("\n");
     printf("单链表B中的元素有%d个:\n",ListLength(B));
     for(i=1; i<=ListLength(B); i++)
      {
       p=Get(B,i);
       if(p)
        printf("%4d",p->data);
      }
     printf("\n");
     DelElem(A,B);/*将单链表A中出现B的元素删除,即A-B*/
     printf("将在A中出现B的元素删除后(A-B),现在A中的元素还有%d个:\n",ListLength(A));
     for(i=1; i<=ListLength(A); i++)
      {
       p=Get(A, i);
       if(p)
        printf("%4d",p->data);
      }
     printf("\n");
     
    }
  • 相关阅读:
    Linux常用
    Netty实战八之引导
    Netty实战九之单元测试
    Netty实战七之EventLoop和线程模型
    作为团队技术负责人,我是这样面试前端的
    Netty实战六之ChannelHandler和ChannelPipeline
    Netty实战五之ByteBuf
    Netty实战四之传输
    Netty实战三之Netty的组件和设计
    Netty实战二之自己的Netty应用程序
  • 原文地址:https://www.cnblogs.com/tao560532/p/2251924.html
Copyright © 2011-2022 走看看