
以下程序表达的是什么意思?
#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;
}
这段代码是用 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 宏定义分别表示操作不可行和内存溢出等。
希望这些解释能帮助你理解这段代码。