Delete函数的逻辑错了,删除重复元素应该是跟前面的元素比较,你的是跟后面的比较。
另外,你scanf读取数据的时候,没有加分隔符,默认使用空格或者换行符分隔输入的数据,而你的输入数据是用逗号分隔的,导致读取的数据是错误的。
代码修改后的运行结果:
修改后的代码;
#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代码的每一行,遍历链表并检查后续节点是否与当前节点重复,若重复则删除后续节点。最终得到了去重后的结果。
希望这个解决方案对你有帮助。如果有任何问题,请随时提问。
【相关推荐】
代码很长,这种建议用桶