#include<stdio.h>
#include<stdlib.h>
typedef struct Lnode
{
int data;
struct Lnode *next;
}Lnode;
//逆序创建链表
struct Lnode *input(int n)
{
struct Lnode *head,*p;
head = (Lnode*)malloc(sizeof(Lnode));
head->next=NULL;//初始化头结点
for(int i=0;i<n;i++)
{
p = (Lnode*)malloc(sizeof(Lnode)); //创建新结点
scanf("%d",&p->data); //给新结点赋值
p->next = head->next;
head->next = p;
}
return head;
}
//删除重复元素,双重循环删除
void del(Lnode *head,int n)
{
int count = 0;
Lnode *p,*q,*r;//r指针用来保存被删除元素的后继结点的信息
p = head->next;
q=p; //初始化规定
while(p)
{
while(q->next)
{
if(p->data==q->next->data) //如果相邻结点元素相同 删除
{
r = q->next;
q->next = r->next;
free(r);
count++;
}
else
{
q = q->next;
}
}
p=p->next;
q=p; //关键步骤 第一层循环规定
}
printf("%d\n",n-count); //输出删除后链表的长度
head = head->next;
for(int i=0; i<n-count; i++)
{
printf("%d", head->data);
if(i==n-count-1)
printf("\n");
else
printf(" ");
head = head->next;
}
}
//输出链表
void output(Lnode *head)
{
Lnode *p;
p = head->next;
while(p->next!=NULL)
{
printf("%d ",p->data);
p = p->next;
}
printf("%d\n",p->data);
}
int main()
{
int n;
Lnode *head;
scanf("%d",&n);
head = input(n); //建立链表
printf("%d\n",n); //输出链表长度
output(head);//输出链表
del(head,n);
return 0;
}
数据结构上机测试2-2:单链表操作B
最新推荐文章于 2022-04-09 15:25:32 发布