主题:那位高手能不能帮我编写一个函数,实现删除向量中所以重复的元素!
yuanfang888
[专家分:0] 发布于 2006-12-23 16:26:00
急啊!再此先谢谢了啊
回复列表 (共2个回复)
沙发
雪光风剑 [专家分:27190] 发布于 2006-12-23 18:44:00
可以用插入法:建立一个新向量,依次取原来向量中的元素填向新向量,但是填之前要和新向量里的值依次比较,没有重复才进行插入。
板凳
瘦古龙 [专家分:0] 发布于 2006-12-25 13:00:00
不知道这个算法能对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]
我来回复