删除递增线性表中多余元素

题目

【问题描述】 已知线性表中的元素以值的递增有序排列,并以单链表作存储结构。
试写一高效的算法,删除表中所有值相同的多余元素(使得操作后的线性表中所
有元素的值均不相同),同时释放被删结点空间,并分析你的算法的时间复杂
度。
【输入形式】输入递增数字序列,以空格进行分隔
【输出形式】输出删除相同的多余元素后的线性表元素,元素之间以空格分隔
【样例输入】 1 2 2 3
【样例输出】 1 2 3
#include 
#include 

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;
}

你可能感兴趣的:(#数据结构习题,算法,数据结构,c#,链表,c语言)