删除列表中相同元素的重复出现次数

时间:2014-09-24 06:13:45

标签: gcc data-structures linked-list

struct node * del(struct node * temp1,int num)
{
         struct node *temp2;
         temp2=NULL;

         if(temp1==NULL)
         {
                  return NULL;
         }

         if(temp1->data==num)
         {
                  temp2=temp1->next;
                  free(temp1);
                  return temp2;
         }
         else
           {
                  temp1->next=del(temp1->next,num);
           }

           return temp1;
}

我在上面的代码中引用了从列表中删除元素但它不能删除所有重复的值。请更正上面的代码或给出任何简单的代码。列表是单线性的 期待

input list = 11 22 11 33 11 44 

output - after deletion of 11 list = 22 33 44

void del()
{
         int i,d;
     struct node *list,*temp;
         printf("Enter data to delete\t");
         scanf("%d",&d);
         list=start;
         for(i=1;i<n;i++)
         {
                  if(start->data==d)
                  {
                     temp=start;
                     start=start->next;
                     list=start;
                     free(temp);
                  }
                  else
                  {
                           if(list->next->data==d)
                           {
                             if(list->next->next==NULL)
                             {
                                 temp=list->next;
                                 list->next=NULL;
                                 free(temp);
                                 break;
                             }
                             temp=list->next;
                             list->next=temp->next;
                             list=list->next;
                             free(temp);
                             continue;
                           }

                           list=list->next;
                  }
         }
}

我也遵循此代码,但它在gcc编译器上无法正常工作。其中n是节点总数。

2 个答案:

答案 0 :(得分:0)

这是代码。使用insertAtEnd()插入重复元素,使用removeAll()删除键的所有匹配项。

#include<stdio.h>
#include<stdlib.h>
#include<limits.h>

struct node
{
    unsigned long key;
    struct node* next;
};

struct seekRecord
{
    struct node* prev;
    struct node* curr;
};

struct node* R;
struct seekRecord* seekRecord;

struct node* createNode(unsigned long key)
{
    struct node* newNode = (struct node*) malloc(sizeof(struct node));
    newNode->key = key;
    newNode->next = NULL;
}

void createSentinelNode()
{
    R = createNode(ULONG_MAX);
}

void seek(unsigned long key)
{
    struct node* prev;
    struct node* curr;
    struct node* next;
    prev = NULL;
    curr = R;
    next = R->next;
    while(next != NULL && curr->key != key)
    {
        prev = curr;
        curr = next;
        next = next->next;
    }
    seekRecord->prev = prev;
    seekRecord->curr = curr;
    return;
}

bool search(unsigned long key)
{
    seek(key);
    return seekRecord->curr->key == key;
}

bool insert(unsigned long key)
{
    struct node* curr;
    seek(key);
    curr = seekRecord->curr;
    if(curr->key == key)
    {
        return false;
    }
    curr->next = createNode(key);
    return true;
}

bool remove(unsigned long key)
{
    struct node* prev;
    struct node* curr;
    seek(key);
    curr = seekRecord->curr;
    prev = seekRecord->prev;
    if(curr->key != key)
    {
        return false;
    }
    prev->next = curr->next;
    free(curr);
    return true;
}

void insertAtEnd(unsigned long key)
{
    struct node* curr;
    curr = R;
    while(curr->next != NULL)
    {
        curr = curr->next;
    }
    curr->next = createNode(key);
    return;
}

void removeAll(unsigned long key)
{
    struct node* prev;
    struct node* curr;
    while(true)
    {
        seek(key);
        curr = seekRecord->curr;
        prev = seekRecord->prev;
        if(curr->key != key)
        {
            return;
        }
        prev->next = curr->next;
        free(curr);
    }
}

void printList()
{
    struct node* curr;
    curr=R->next;
    while(curr != NULL)
    {
        printf("%lu\t",curr->key);
        curr = curr->next;
    }
    printf("\n");
    return;
}

int main()
{
    seekRecord = (struct seekRecord*) malloc(sizeof(seekRecord));
    createSentinelNode();
    insertAtEnd(11);
    insertAtEnd(22);
    insertAtEnd(33);
    insertAtEnd(11);
    insertAtEnd(44);
    printList();
    removeAll(11);
    printList();
}

答案 1 :(得分:0)

void delall(int del)
{
                  struct node *t1,*temp;
                  t1=NULL;
                  temp=start;
                  while(temp!=NULL&&temp->data==del)
                  {
                           t1=temp;
                           temp=temp->next;
                           start=temp;
                           free(t1);
                  }
                  while(temp!=NULL)
                  {
                           if(temp->data==del)
                           {
                                    t1->next=temp->next;
                                    free(temp);
                                    temp=t1->next;

                           }
                           else
                           {
                                    t1=temp;
                                    temp=temp->next;
                           }
                  }
}