#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
}NODE;
NODE *create(int a[], int n);
void print(NODE *h) ;
void delSame(NODE *h);
int main( )
{
int a[10],i;
NODE *head;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
head = create(a,10);
print(head);
delSame(head);
print(head);
return 0;
}
void print(NODE *h)//遍历链表并输出
{
while(h!=NULL)
{
printf("%3d",h->data);
h=h->next;
}
printf("\n");
}
void delSame(NODE *h)//删除奇数值结点
{
NODE *p,*q,*s;
p=h;//此时p为链表第一个元素
for(p;p!=NULL;p=p->next)//p遍历整个链表,当p不等于空时,p指向p的下一个节点
{
s=p;//s指向要删除节点的前一个
for(q=p->next;q!=NULL;)
{
if(q->data==p->data)//当q和p的值相同时
{
s->next=q->next;//s直接指向q的下一个结点
free(q);//释放q
q=s->next;
}
else
{
s=q;//s指向下一个结点q
q=q->next;//q指向q的下一个结点
}
}
}
}
NODE *create(int a[],int n)//尾插法
{
NODE *head=NULL,*tail=NULL;
NODE *temp=(NODE*)malloc(sizeof(NODE));
temp->data=a[0];
temp->next=NULL;
head=temp;
tail=temp;
int i;
for(i=1;i<10;i++)
{
temp=(NODE*)malloc(sizeof(NODE));
temp->data=a[i];
tail->next=temp;
tail=temp;
}
tail->next=NULL;
return head;
}
链表尾插,删除重复的结点
最新推荐文章于 2024-08-08 15:12:59 发布