資料結構上機測試2-2:單連結串列操作B

power_to_go發表於2016-08-05
資料結構上機測試2-2:單連結串列操作B
Time Limit: 1000ms Memory limit: 65536K 有疑問?點這裡^_^
題目描述
按照資料輸入的相反順序(逆位序)建立一個單連結串列,並將單連結串列中重複的元素刪除(值相同的元素只保留最後輸入的一個)。
輸入
第一行輸入元素個數n;
第二行輸入n個整數。
輸出
第一行輸出初始連結串列元素個數;
第二行輸出按照逆位序所建立的初始連結串列;
第三行輸出刪除重複元素後的單連結串列元素個數;
第四行輸出刪除重複元素後的單連結串列。
示例輸入
10
21 30 14 55 32 63 11 30 55 30
示例輸出
10
30 55 30 11 63 32 55 14 30 21
7

30 55 11 63 32 14 21

# include <stdio.h>
# include <stdlib.h>
typedef struct node
{
    int data;
    struct node*next;
} Node;
Node* create(int n);
void show(Node*head);
int del(Node*head);
int main()
{
    int n,len;
    Node*head;
    scanf("%d",&n);
    head = create(n);
    printf("%d\n",n);
    show(head);
    len = del(head);
    printf("%d\n",n-len);
    show(head);
    return 0;
}
Node*create(int n)
{
    Node*head,*p;
    head = (Node*)malloc(sizeof(Node));
    head->next = NULL;
    while(n--)
    {
        p = (Node*)malloc(sizeof(Node));
        scanf("%d",&p->data);
        p->next = head->next;
        head->next = p;
    }
    return head;
}

void show(Node*head)
{
    Node*p;
    p = head->next;
    while(p)
    {
        if(p->next)
            printf("%d ",p->data);
        else
            printf("%d\n",p->data);
        p = p->next;
    }
}

int del(Node*head)
{
    int num = 0;
    Node*p,*q,*r;
    p = head->next;
    while(p)//遍歷連結串列
    {
        q = p;
        while(q->next)//檢測p之後的元素是否與p相同
        {
            if(q->next->data == p->data)
            {
                num++;
                r = q->next;
                q->next = r->next;
                free(r);
                //r = NULL;
            }
            else
            {
                q = q->next;
            }
        }
        p = p->next;//下一個元素
    }
    return num;
}


相關文章