数据结构——第二章线性表·2015真题

MiracleWolf 2024-2-11 104 2/11

一、题目描述

数据结构——第二章线性表·2015真题

二、算法步骤

本题可以用空间换时间的方法,用数组a存放链表中每个数绝对值的出现次数,如果出现不止一次则对相应的链表节点进行删除操作;在删除时,需要一个prev指针,保存当前cur指针的前一个节点,方便与后续节点进行链接。
完成代码如下:

#include 
#include 
#include
using namespace std;
typedef int elementType;
typedef struct Node  //节点数据结构定义
{
    elementType data;
    struct Node* link;
}Node,LinkList;
const int N = 100;
int a[N]; //记录出现数字出现次数
Node* Init(LinkList* L)
{
    L = (LinkList*)malloc(sizeof(Node));
    L->data = 0;
    L->link = NULL;
    return L;
}
Node* Create(int x)
{
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = x;
    newNode->link = NULL;
    return newNode;
}
void Print(LinkList* L)
{
    Node* cur = L;
    cur = cur->link;
    while (cur!= NULL)
    {
        cout << cur->data;
        if(cur->link!=NULL)printf("->");
        cur = cur->link;
    }
    printf("\n");
}

int main()
{
    /// 
    ///链表初始化
    /// 
    /// 
    LinkList* L = NULL;
    L = Init(L);
    int n; cin >> n;
    Node* cur = L;
    for (int i = 0; i < n; i++)
    {
        elementType x; cin >> x;
        Node* newNode = Create(x);
        cur->link = newNode;
        cur = cur->link;
    }
    cout << "L1为" << endl; Print(L);
    /// 
    /// 解法步骤
    /// 
    /// 

    cur = L->link;
    Node* prev = NULL;

    while (cur)
    {
        if (a[abs(cur->data)] == 0) { a[abs(cur->data)]++;  }
        else
        {
            prev->link= cur->link; //首先前一个指向后一个
            free(cur);  //释放当前节点
            cur = prev; //当前节点倒推回前一个节点
        }
        prev = cur;//更新前一个节点
        cur = cur->link;//使当前节点后移
    }
    Print(L);//最后打印一下
    return 0;
}

结果展示:
```cpp
5
21 -15 -15 -7 15
L1为
21->-15->-15->-7->15
21->-15->-7


# 三、总结
  本题较为简单,注意空间换时间的思想,然后就是删除节点的时候要注意保存前一个节点。
- THE END -

MiracleWolf

2月11日17:06

最后修改:2024年2月11日
0