以下程序表达的是什么意思?

#include<malloc.h>
#include <stdio.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;

typedef int ElemType ;
typedef struct LNode
{
ElemType data;
struct LNode * next;
} LNode ,*LinkList;
Status InitList_L(LinkList& L)
{
L = (LNode*)malloc(sizeof(LNode));
if (L==NULL)
return ERROR;
L->data = NULL;
L->next = NULL;
return OK;
}
Status DestroyList_L(LinkList& L)
{
LinkList p;
while (L)
{
p = L;
L=L->next;

free(p);
}
return OK;
}
Status ListInsert_L(LinkList &L,int i,ElemType e)
{
LinkList p = L;
int j=0;
while (p && j < i-1)
{
p=p->next;
j++;
}
if (p==NULL || j>i-1)
return ERROR;

else
{
LinkList s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
}
Status ListDelete_L(LinkList & L,int i,ElemType& e)
{
LinkList p = L;
int j = 0;
while (p->next && j< i-1)
{
p = p->next;
++j;
}
if (p->next==NULL || j>i-1)
return ERROR;

else
{

LinkList s = p->next;
p ->next = s->next;

e = s->data;
free(s);
return OK;
}
}

void ListPrint_L(LinkList L)
{
LinkList p = L->next;
printf("LinkList:(");
while (p)
{
printf("%d,",p->data);
p = p ->next;
}
printf(")\n");
}

//自行编写下面的输入函数
void ListInput(LinkList& L)
{//
int n;
printf("please input number:");
scanf("%d",&n);
for(int i=0;i<n;i++);

{
int v;
scanf("%d",&v);
ListInsert_L(L,1,v);
}
}
int main(int argc, char* argv[])
{
char s[256];
printf("Input your name:");
printf("%s\n",gets(s));

LinkList L; InitList_L(L); ListPrint_L(L);
//调用输入函数
ListInput(L);
//ListInsert_L(L,1,1);
//ListInsert_L(L,2,5);
//ListInsert_L(L,3,8);
//ListInsert_L(L,4,10);7

ListPrint_L(L);
int v;
ListDelete_L(L,3,v);
ListPrint_L(L);
return 0;
}

整段代码的意思就是实现了链表的新建、节点插入、节点删除和打印等功能

对其进行了详细的注释,如下图:


注释后的代码如下:(其中修改了两处地方,详见注释加粗部分)

#include <malloc.h>

#include <stdio.h>

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

#define OVERFLOW -2

typedef int Status;

typedef int ElemType;

typedef struct LNode { // 链表节点结构体

    ElemType data;

    struct LNode * next;

} LNode, *LinkList;

// 设置别名,LNode等价于struct LNode, LinkList等价于struct LNode *

Status InitList_L(LinkList& L) { // 初始化L链表,新建了第0个节点

    L = (LNode*)malloc(sizeof(LNode)); // 分配内存空间

    if ( L == NULL)

        return ERROR;

    L->data = NULL;

    L->next = NULL;

    return OK;

}

Status DestroyList_L(LinkList& L) { // 销毁L链表

    LinkList p;

    while (L) { // 依次遍历链表上的每个节点

        p = L;

        L = L->next;

        free(p); // 释放之前分配的内存空间

    }

    return OK;

}

// 在链表L的第i个节点前插入新节点,节点值为e

Status ListInsert_L(LinkList &L, int i, ElemType e) {

    LinkList p = L; // 注意p初始指向链表第0个节点

    int j = 0;

    while (p && j < i-1) { // p移动到第i-1个节点

        p = p->next;

        j++;

    }

    if (p == NULL || j > i-1) // i为0或超过链表长度,插入失败

        return ERROR;

    else {

        LinkList s = (LNode*)malloc(sizeof(LNode)); // 新建待插入的节点

        s->data = e; // s值为e,要插入到第i-1个节点之后成为第i个节点

        s->next = p->next; // s插入到p和p->next之间

        p->next = s; // 满足p-->s-->(p->next)

        return OK;

    }

}

// 删除链表L的第i个节点,并令e保存节点值

Status ListDelete_L(LinkList & L, int i, ElemType& e) {

    LinkList p = L; // 注意p初始指向链表第0个节点

    int j = 0;

    while (p->next && j < i-1) { // p移动到第i-1个节点;p不能为最后一个节点

        p = p->next;

        ++j;

    }

    if (p->next == NULL || j > i-1) // i为0或超过链表长度,删除失败

        return ERROR;

    else { // 要删除p之后的节点,即p->next

        LinkList s = p->next; // 先保存待删除的节点

        p ->next = s->next; // p->next直接指向待删除节点的下个节点

        e = s->data; // 保存待删除节点值

        free(s); // 释放节点空间

        return OK;

    }

}

void ListPrint_L(LinkList L) { // 打印链表

    LinkList p = L->next; // 注意L为第0个节点,L->next才为第1个节点

    printf("LinkList:(");

    while (p) { // 依次输出每个节点值

        printf("%d,", p->data);

        p = p->next;

    }

    printf(")\n");

}

void ListInput(LinkList& L) {

    int n;

    printf("please input number:");

    scanf("%d", &n); // 输入链表节点个数

    for(int i = 0; i < n; i++) // 这里原代码多加了一个分号; 要去掉

    {

        int v;

        scanf("%d", &v); // 输入每个节点值

        ListInsert_L(L, 1, v); // 每个节点都插入到第1个位置

    }

}

int main(int argc, char* argv[]) {

    char s[256];

    printf("Input your name:");

    printf("%s\n", gets(s));

    LinkList L; InitList_L(L); ListPrint_L(L); // 初始化空链表L,新建第0个节点

    ListInput(L); //调用输入函数

    //ListInsert_L(L,1,1);

    //ListInsert_L(L,2,5);

    //ListInsert_L(L,3,8);

    //ListInsert_L(L,4,10);

    ListPrint_L(L); // 打印新建的链表

    int v;

    ListDelete_L(L, 3, v); // 删除第3个节点,获取其值到v中

    ListPrint_L(L); // 打印删除后的链表

    DestroyList_L(L); // 最后还应销毁链表,释放内存空间

    return 0;

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2022-12-25

这段代码是用 C 语言实现的单链表的基本操作。

其中,定义了一个结构体 LNode 表示单链表的节点,包含两个成员:data 存储节点的数据,next 存储下一个节点的地址。然后定义了单链表的类型 LinkList,是一个指向 LNode 类型的指针。

程序中定义了一系列函数,用于实现单链表的基本操作。

    InitList_L 函数用于初始化单链表,分配一个头节点并将它的 next 指针赋为 NULL。

    DestroyList_L 函数用于销毁单链表,释放链表中所有节点的内存。

    ListInsert_L 函数用于在单链表的指定位置插入一个新的节点。

    ListDelete_L 函数用于从单链表中删除指定位置的节点。

    ListPrint_L 函数用于打印单链表中的所有节点的数据。

    最后,程序中定义了一个函数 ListInput,用于输入单链表中的所有节点的数据。这个函数会提示用户输入节点的数量,然后循环调用 ListInsert_L 函数,将用户输入的数据插入到单链表的末尾。

这段代码还包含了一些宏定义,用于定义状态常量,便于程序的扩展和维护。

例如,TRUE 和 FALSE 宏定义分别表示真和假;OK 和 ERROR 宏定义分别表示操作成功和失败;INFEASIBLE 和 OVERFLOW 宏定义分别表示操作不可行和内存溢出等。

希望这些解释能帮助你理解这段代码。

第2个回答  2023-03-13
这段程序是一个单链表的基本操作实现,包括初始化列表、销毁列表、在指定位置插入元素、在指定位置删除元素和打印列表等函数。主函数中通过调用输入函数和其他函数完成对单链表的创建、插入、删除和打印操作。
相似回答