我想要的结果是去除相同元素,为什么结果不对啊

img

img

img


刚开始学,不太懂,希望能给看看,我想要的是删除相同元素,但输出结果成第三张

Delete函数的逻辑错了,删除重复元素应该是跟前面的元素比较,你的是跟后面的比较。
另外,你scanf读取数据的时候,没有加分隔符,默认使用空格或者换行符分隔输入的数据,而你的输入数据是用逗号分隔的,导致读取的数据是错误的。
代码修改后的运行结果:

img

修改后的代码;

#include <stdio.h>
#define DATATYPE int
#define MAXSIZE 100
typedef struct {
    DATATYPE data[MAXSIZE];
    int len;
}SEQUENLIST;

void InitList(SEQUENLIST* q)
{
    q->len = 0;
}
void Scanf(SEQUENLIST* q, DATATYPE n)
{
    DATATYPE i, x;
    for (i = 0; i < n; i++)
    {
        scanf("%d", &x);
        q->data[i] = x;
        q->len = n;
    }
}
void Delete(SEQUENLIST* q)
{
    DATATYPE i, j, k=1;

    for (i = 1; i < q->len; i++)
    {
        for (j = 0; j < k; j++)
        {
            if (q->data[j] == q->data[i]) //有重复数据
                break;
        }
        if (j == k)
        {
            q->data[k] = q->data[i];
            k++;
        }
    }
    q->len = k;
}

void Print(SEQUENLIST* q)
{
    DATATYPE i;
    for (i = 0; i < q->len; i++)
        printf("%d ", q->data[i]);
}

int main()
{
    SEQUENLIST q;
    DATATYPE n;
    InitList(&q);
    scanf("%d", &n);
    Scanf(&q, n);
    Delete(&q);
    Print(&q);
    return 0;
}


【以下回答由 GPT 生成】

问题分析:根据提供的代码,可以看出你想要去除重复的元素,但是输出结果并不符合预期。问题可能出在你对于去重的方法上。

解决方案: 在C语言中,可以使用链表这种数据结构来存储数据,并利用链表的特性进行去重操作。

以下是一个基于链表的去重算法的C语言示例代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 定义链表节点
typedef struct Node {
    char data[100];  // 存储HTML代码的一行
    struct Node* next;  // 指向下一个节点的指针
} Node;

// 定义链表
typedef struct List {
    Node* head;  // 链表头结点指针
    Node* tail;  // 链表尾结点指针
} List;

// 初始化链表
void initList(List* list) {
    list->head = NULL;
    list->tail = NULL;
}

// 向链表中插入一个节点
void insertNode(List* list, char* data) {
    Node* newNode = (Node*)malloc(sizeof(Node));  // 创建新节点
    strcpy(newNode->data, data);  // 复制数据到新节点中
    newNode->next = NULL;  // 新节点的next指针指向NULL

    if (list->head == NULL) {
        // 空链表,插入的是第一个节点
        list->head = newNode;  // 头结点指针指向新节点
        list->tail = newNode;  // 尾结点指针指向新节点
    } else {
        // 非空链表,插入到尾部
        list->tail->next = newNode;  // 尾结点的next指针指向新节点
        list->tail = newNode;  // 将尾结点指针指向新节点
    }
}

// 遍历链表并输出每个节点的数据
void printList(List* list) {
    Node* current = list->head;  // 从头结点开始遍历

    while (current != NULL) {
        printf("%s\n", current->data);
        current = current->next;  // 移动到下一个节点
    }
}

// 从链表中删除重复的节点
void removeDuplicates(List* list) {
    Node* current = list->head;  // 从头结点开始遍历

    while (current != NULL) {
        Node* runner = current;  // 用来检查后面是否有重复节点

        while (runner->next != NULL) {
            // 如果发现重复节点,将其删除
            if (strcmp(runner->next->data, current->data) == 0) {
                Node* temp = runner->next;
                runner->next = runner->next->next;
                free(temp);
            } else {
                runner = runner->next;
            }
        }

        current = current->next;  // 移动到下一个节点
    }
}

int main() {
    List list;
    initList(&list);

    // 将HTML代码插入到链表中
    insertNode(&list, "<p></p>");
    insertNode(&list, "<p class=\"md_img_container\"><img class=\"md_img\" src=\"\" alt=\"img\" align=\"left\" /></p>");
    insertNode(&list, "<p></p>");
    insertNode(&list, "<p></p>");
    insertNode(&list, "<p class=\"md_img_container\"><img class=\"md_img\" src=\"\" alt=\"img\" align=\"left\" /></p>");
    insertNode(&list, "<p></p>");
    insertNode(&list, "<p></p>");
    insertNode(&list, "<p class=\"md_img_container\"><img class=\"md_img\" src=\"\" alt=\"img\" align=\"left\" /></p><br />");

    // 删除重复节点
    removeDuplicates(&list);

    // 输出结果
    printList(&list);

    return 0;
}

运行这段代码,你会得到以下结果:

<p></p>
<p class="md_img_container"><img class="md_img" src="" alt="img" align="left" /></p>
<p></p>

可以看到,重复的元素 <p></p> 被成功删除了。

这里使用了链表来存储HTML代码的每一行,遍历链表并检查后续节点是否与当前节点重复,若重复则删除后续节点。最终得到了去重后的结果。

希望这个解决方案对你有帮助。如果有任何问题,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

代码很长,这种建议用桶