单链表中去除重复数据

在写完上篇后,又对单链表中去除重复的数据进行编程,以下是编写的代码

#include <stdio.h>
#include <stdlib.h>
#define N 10
struct Data{
    int num;
struct Data *next;
};


struct Data * Insert()
{
   int data,i;
   struct Data *head,*r,*s;
   head = ( struct Data * )malloc( sizeof (struct Data));
   head->next = NULL;   
   r=head;
      for (i=0; i<N; i++ )
      {
     scanf("%d",&data);
 s = ( struct Data *)malloc(sizeof (struct Data));
 s->num = data;
 s->next = r->next;
 r->next = s;
 r=s;
 }
    return head;
}


void print(struct Data *head)
{
   struct Data *p;
   p = head->next;
   printf("the list is :");
     while(p!=NULL)
{
printf("%d\t",p->num);
    p=p->next;
}
printf("\n");
}




struct Data *quchong(struct Data *head)
{
    struct Data *p,*q,*s;
p = head->next;
while(p->next!=NULL)
{
   q=p;
  while(q->next!=NULL)
  {
   if(q->next->num == p->num)
   {
         s = q->next;
 q->next = s->next;
 free(s);
   }
else
          q=q->next;
  }
p=p->next;


}
    return head;
}




int main ( int argc , char * argv [])
{
    struct Data *head;
head = Insert();
    print(head);
head = quchong(head);
print(head);
}



采用上篇文章尾插法进行链表数据插入,在quchong()函数中,将链表头结点进行参数传递,该函数的思想是:

(1)首先p指向第一个结点,在第一层while循环中p控制的是原始数据结点,即要比较的数据;

(2)在第一层while循环中q=p(我曾认为应该是q=p->next,结果发现当有相同的数据存储在相邻的结点时不能正确删除,因为此时s指针的指向将发生错误,与预期不同)

(3)在第二层循环中,q控制的是目标数据结点,目标数据与原始数据的数据域相同时用指针s指向该当前目标数据结点,用s = q->next;   q->next = s->next;   free(s);   等语句释放当前重复的数据结点,接着q指针依次向后搜索是否还有与当前p结点数据域重复的结点;若有,循环(3)步骤;若查找到链表结尾没有则p指针指向下一结点,即跳出第二层while循环,进入第一层循环



因为本人是双系统在Linux下写的程序运行正确,现在在windows写没有办法截图,大家有不同见解的可以提出来一块学习!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值