删除重复的链表 c语言实现

#include 

typedef struct node
{
   int num;
   struct node *next;
}*LINK,NODE;
/*
这个函数用来创建有重复节点的单链表,
简单起见,每个节点的num成员变量按照节创建先后顺序付值,依次为
1,2,3...
第一个int n参数是要创建的总结点个数
第二个参数n1是第几个哪个节点与前面的节点的num成员变量相同
例如调用link_cr(5,2),则产生的节点如下:
NODE 1 num 1
NODE 2 num 2
NODE 3 num 2
NODE 4 num 4
NODE 5 num 5
*/
LINK link_cr(int n,int n1);

void link_show(LINK head);
LINK link_del(LINK head);

int main()
{
    LINK head;
    head=link_cr(5,2);
    link_show(head);
    head=link_del(head);
    printf("After delete!\n");
    link_show(head);
    getchar();

}

void link_show(LINK head)
{
  LINK p1=head;
  while(p1!=NULL)
  {
    printf("NODE:%d Address:%ld \n",p1->num,&(*p1->next));
    p1=p1->next;
  }


}

LINK link_cr(int n,int n1)
{
  LINK p1,head,p2;
  int i;
  p1=p2=head=(LINK)malloc(sizeof(NODE));
  p1->num=1;
  for(i=2;i<=n;i++)
  {
    p1=(LINK)malloc(sizeof(NODE));
    p1->num=i;
    if(i==n1) p1->num--;
    p2->next=p1;
    p2=p1;
  }
  p2->next=NULL;
  return head;
}

LINK link_del(LINK head)
{
  LINK p1=head,p2,p3;
  int number;

  while(p1!=NULL)
  {
    p2=p1->next;
    number=p1->num;
    p3=p1;
    while(p2!=NULL)
    {
    if(p2->num==number)
    {
      p3->next=p2->next;
      break;
    }
    p3=p2;
    p2=p2->next;
    }
    p1=p1->next;
  }
  return head;
}

Leave a Reply

Your email address will not be published.