单链表实现A-B操作

#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");
 
}
posted @ 2011-11-16 22:40  [无名]  阅读(2342)  评论(0编辑  收藏  举报