c++ - 删除结构中的第一个元素

标签 c++ struct delete-operator

我有一个代码,试图删除结构中的第一个ID。它曾经可以工作,但是现在只返回“ЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭЭ”(重复的俄语字母)。我尝试重新安装VS,但没有帮助。我知道它有效,因为我在在线编译器上尝试过它。
这两个警告也指向删除功能,我猜这是问题所在。
警告C4156删除数组表达式而不使用“delete”的数组形式;数组形式替换
警告C4154删除数组表达式;转换为提供的指针

这是代码itslef:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <locale.h>
#include <iostream>
#pragma warning (disable: 4703) //disables warning of uninitialized variable j
using namespace std;
#define  MAXDL    9      
struct el_sp
{
    char  id[MAXDL];
    struct el_sp* sled;
};
void  vkl(struct el_sp** p, char t_id[]) //enters the entered ID's from keyboard into the struct
{
    struct el_sp* pt,
        * k, * j;
    pt = (struct el_sp*)malloc(sizeof(struct el_sp));
    strcpy_s(pt->id, t_id);
    if (*p == NULL || strcmp(pt->id, (*p)->id) < 0)
    {
        pt->sled = *p; *p = pt;
    }
    else
    {
        k = *p;
        while (k != NULL && strcmp(pt->id, k->id) >= 0)
        {
            j = k; k = k->sled;
        }
        j->sled = pt; pt->sled = k;
    }
}

void pech_sp(struct el_sp* p) //prints the struct
{
    struct el_sp* i;
    char* o;
    printf("\Result:\n");
    for (i = p; i != NULL; i = i->sled)
        puts(i->id);
}

int main() {
    setlocale(LC_ALL, "RUS");
    struct el_sp* p;
    unsigned  n;
    unsigned  i;
    char t_id[MAXDL];

    printf("\nEnter the amount of identificators\n n=");
    scanf_s("%u", &n);
    getchar();
    p = NULL;
    printf("Enter the identificators (press enter after each one)\n");
    for (i = 1; i <= n; i++)
    {
        gets_s(t_id);
        vkl(&p, t_id);
    }
    delete p->id;
    pech_sp(p);
    return 0;
}

附言无论我用什么代码,Delete都会做同样的事情
P.S.S.抱歉,格式化不正确,这是我们教授需要的格式

最佳答案

不要调用delete p->id。除了使您的程序崩溃之外,它没有任何用途:new既不分配程序,也不破坏程序所在的结构。

另外,切勿使用delete尝试释放malloc ed内存,或使用free释放new ed内存。

您是否要删除整个第一个节点?然后做类似的事情

el_sp *oldp = p;
p = p->next;
free(oldp);

实际上,删除中间的节点要容易一些。使用指向前一个元素(prev)和当前元素(cur)的“追逐指针”。如果cur是您要删除的节点,只需执行
prev->next->next = cur->next;
delete cur;

(假设您使用new分配节点,应该这样做!)

关于c++ - 删除结构中的第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62418829/

相关文章:

c++ - C++内存管理相关查询

c++ - 尝试在派生类中使用 spaceship 运算符

ios - 从不同类 Swift 中的结构内的变量获取数据

c++ - C++ 中堆栈分配对象的 WrapperPointer 类和释放

c++ - 为什么要替换默认的 new 和 delete 运算符?

c++ - 设置地址后是否需要删除指针?

带有巨大静态数组的 C++ 大头文件(4.5MB 或更多)

c++ - 如何将对象(或指针)从 C++ .NET 应用程序发送到 VB 应用程序

c - struct sockaddr_un 与 sockaddr

c# - 什么时候树结构应该是类/结构?