回 帖 发 新 帖 刷新版面

主题:那位高手能不能帮我编写一个函数,实现删除向量中所以重复的元素!

急啊!再此先谢谢了啊

回复列表 (共2个回复)

沙发

可以用插入法:建立一个新向量,依次取原来向量中的元素填向新向量,但是填之前要和新向量里的值依次比较,没有重复才进行插入。

板凳

不知道这个算法能对lz有帮助不?

[code]
/*        删除单链表中重复节点的操作      */

/*                     by W.Z.T           */

#include <stdio.h>

typedef struct node_link{
    int data;
    struct node_link *next;
}node;

node *create_link(int m)
{
    node *head=NULL,*p,*s;
    int i;
    
    for(i=0;i<m;i++){
        s=(node *)malloc(sizeof(node));
        scanf("%d",&s->data);
        s->next=NULL;
        if(head==NULL){
            p=head=s;
        }
        else{
            p->next=s;
            p=s;
        }
    }
    p->next=NULL;
    
    return head;
}

void print_link(node *head)
{
    node *p;
    
    p=head;
    if(!p){
        printf("Node is NULL.\n");
        exit(0);
    }
    
    while(p){
        printf("%d",p->data);
        p=p->next;
    }
}

node *delete_same_node(node *head)  /* 删除单链表中重复节点 */
{
    node *r_head,*q,*s,*r;
    int i=0;
    
    r_head=head; /* 记录头节点位置 */
    while(head->next!=NULL){
        q=head;      /* q指向s的前一节点 */
        s=head->next;
        while(s!=NULL){
            if(head->data==s->data){   /* 有元素和当前head相同 */
                if(s->next==NULL){   /* s为最后一个节点 */
                    q->next=NULL;s=s->next;  /* 删除s */
                    if(i==0) r=q;   /* 记录第一次与当前head不同的节点位置 */
                }
                else{
                    q->next=s->next;   /* 删除s */
                    s=s->next;
                }
            }
            else{     /* 当前元素与当前节点不相同 */
                q=s;   /* 继续循环 */
                s=s->next;
                if(i==0) r=q;  /* 记录第一次与当前head不同的节点位置 */
                i++;
            }
        }
        i=0;head=r;   /* 还原i值,使head前进 */
    }
    
    return r_head;
}

int main(void)
{
    node *head;
    int m;
    
    printf("input numbers:");
    scanf("%d",&m);
    head=create_link(m);
    printf("create ok\n");
    
    head=delete_same_node(head);
    printf("\ndelete ok.\n");
    
    print_link(head);

    return 0;
}
[/code]

我来回复

您尚未登录,请登录后再回复。点此登录或注册