题目
【问题描述】
已知线性表中的元素以值的递增有序排列,并以单链表作存储结构。
试写一高效的算法,删除表中所有值相同的多余元素(使得操作后的线性表中所
有元素的值均不相同),同时释放被删结点空间,并分析你的算法的时间复杂
度。
【输入形式】输入递增数字序列,以空格进行分隔
【输出形式】输出删除相同的多余元素后的线性表元素,元素之间以空格分隔
【样例输入】
1 2 2 3
【样例输出】
1 2 3
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
struct Node *next;
int data;
} Node, *LinkList;
void InitList(LinkList *L)
{
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
}
LinkList CreateList(LinkList *L, int a[], int n)
{
Node *p = *L;
for (int i = 0; i < n; i++)
{
Node *newnode = (LinkList)malloc(sizeof(Node));
newnode->data = a[i];
newnode->next = p->next;
p->next = newnode;
p = newnode;
}
return *L;
}
void DelList(LinkList *L)
{
Node *p = (*L)->next;
while (p != NULL && p->next != NULL)
{
if (p->data == p->next->data)
{
Node *temp = p->next;
p->next = temp->next;
free(temp);
}
else
{
p = p->next;
}
}
}
void PrintList(LinkList L)
{
Node *p = L->next;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void ClearList(LinkList*L)
{
while ((*L)->next != NULL)
{
Node *p= (*L)->next;
(*L)->next=p->next;
free(p);
}
}
int main()
{
LinkList L;
InitList(&L);
int a[100];
int n = 0;
int i;
for (i = 0;; i++)
{
scanf("%d", &a[i]);
n++; // 计算输入个数
if (getchar() == '\n')
break; // 遇回车中断
}
CreateList(&L, a, n);
DelList(&L);
PrintList(L);
// 释放链表空间
ClearList(&L);
return 0;
}
数组方法
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[100];
int n=0;
for (int i = 0;; i++)
{
scanf("%d", &a[i]);
n++; // 计算输入个数
if (getchar() == '\n')
break; // 遇回车中断
}
for(int j=0;j<n;)
{
if(a[j]==a[j+1])
j++;
else
{printf("%d ",a[j]);
j++;
}
}
return 0;
}