Status InitList(LinkList *L) { /* 构造一个空的线性链表 */ Link p; p = (Link)malloc(sizeof(LNode)); /* 生成头结点 */ if (p) { p->next = NULL; (*L).head = (*L).tail = p; (*L).len = 0; return OK; } else return ERROR;//内存分配不够 } Status MakeNode(Link *p, ElemType e) { /* 分配由p指向的值为e的结点,并返回OK;若分配失败。则返回ERROR */ *p = (Link)malloc(sizeof(LNode)); if (!*p) return ERROR; (*p)->data = e; return OK; }
时间: 2024-04-20 15:25:52 浏览: 156
这段代码是用于初始化一个空的线性链表,并且实现了创建一个节点的函数。
函数`InitList`接受一个指向指针的指针`L`作为参数,用于修改指针`L`所指向的值。它首先使用`malloc`函数为头结点`p`分配内存空间,如果内存分配成功,则将头结点的`next`指针指向NULL,将头结点赋值给链表的`head`和`tail`指针,并将链表的长度初始化为0。最后,返回一个代表成功的状态值OK。如果内存分配失败,则返回一个代表错误的状态值ERROR。
函数`MakeNode`接受一个指向指针的指针`p`和要存储的元素`e`作为参数,用于修改指针`p`所指向的值。它使用`malloc`函数为新节点分配内存空间,如果内存分配成功,则将新节点的数据域赋值为`e`,并返回一个代表成功的状态值OK。如果内存分配失败,则返回一个代表错误的状态值ERROR。
需要注意的是,这段代码中没有对内存分配是否成功进行判断。在实际应用中,应该增加对内存分配的判断,确保内存分配成功后再进行后续操作。另外,可以看出这段代码是基于线性链表的实现,其中头结点既作为链表的起始节点,也作为链表的尾节点,通过`head`和`tail`指针来标记链表的头部和尾部。
相关问题
void InitList(LinkList *L) { *L = NULL; } // 根据学号进行插入 int InsertById(LinkList *L, Student s) { LNode *p = *L, *pre = NULL; while (p != NULL && p->data.id < s.id) { pre = p; p = p->next; } if (p != NULL && p->data.id == s.id) { return 0; // 学号已存在 } LNode *newNode = (LNode *)malloc(sizeof(LNode)); newNode->data = s; newNode->next = p; if (pre == NULL) { *L = newNode; } else { pre->next = newNode; } return 1; } // 根据成绩进行插入 int InsertByScore(LinkList *L, Student s) { LNode *p = *L, *pre = NULL; while (p != NULL && p->data.score >= s.score) { pre = p; p = p->next; } if (p != NULL && p->data.id == s.id) { return 0; // 学号已存在 } LNode *newNode = (LNode *)malloc(sizeof(LNode)); newNode->data = s; newNode->next = p; if (pre == NULL) { *L = newNode; } else { pre->next = newNode; } return 1; }参考文献
这段代码是一个基于链表实现的学生信息管理系统,包括根据学号和成绩进行插入操作。其中,InitList函数用于初始化链表,InsertById函数用于根据学号插入学生信息,InsertByScore函数用于根据成绩插入学生信息。每个学生信息包括学号和成绩。在插入时,如果学号已经存在,则返回0,表示插入失败。如果插入成功,则返回1。
//初始化单链表 bool InitList(Lnode *L){ L=(Lnode*)malloc(sizeof(Lnode)); L->next=NULL; if(L==NULL)//内存不足,头结点无法分配到空间 return false; return true; } //(头插法)创建单链表 void CreateListF(Lnode *L,ElemType a[],int n){ Linklist s; L=(Lnode*)malloc(sizeof(Lnode)); L->next=NULL; int j=-0; for(j=0;j<n;j++){ s=(Lnode *)malloc(sizeof(Lnode)); s->data=a[j]; s->next=L->next; L->next=s; } } /* //(尾插法)创建单链表 void CreateListR(Lnode *L,ElemType a[],int n){ Linklist s, r; L=(Lnode*)malloc(sizeof(Lnode)); r=L; int i=0; for(i=0;i<n;i++){ s=(Lnode*)malloc(sizeof(Lnode)); s->data=a[i]; r->next=s; r=s; } r->next=NULL; } //判断链表是否为空 bool ListEmpty(Lnode *L){ return (L->next==NULL); } */ //输出链表 void DispList(Lnode *L){ Lnode* p=L->next; while(p!=NULL){ printf("%d",p->data); p=p->next; } printf("\n"); }
这段代码中包含了几个函数用于处理单链表。
1. `bool InitList(Lnode *L)`: 这个函数用于初始化单链表。它接受一个指向链表头结点的指针 L。在函数内部,它首先分配一个头结点的内存空间,并将其地址赋给 L。然后,将头结点的指针域 L->next 设置为 NULL,表示链表为空。最后,如果分配内存失败,返回 false;否则,返回 true。
2. `void CreateListF(Lnode *L,ElemType a[],int n)`: 这个函数使用头插法创建单链表。它接受一个指向链表头结点的指针 L,一个元素数组 a,以及元素个数 n。在函数内部,它首先分配一个头结点的内存空间,并将其地址赋给 L。然后,使用循环将数组中的元素依次插入到链表的头部。具体操作是:分配一个新节点 s,并将数组中的元素赋值给 s->data;然后,将新节点 s 插入到头结点之后,即 s->next = L->next,L->next = s。最后,循环结束后,完成链表的创建。
3. `void DispList(Lnode *L)`: 这个函数用于输出链表的元素值。它接受一个指向链表头结点的指针 L。在函数内部,它使用循环遍历链表的个节点,从头结点的下一个节点开始,直到遍历到链表末尾(即指针 p 指向 NULL)。在循环中,首先使用 printf 函数输出当前节点的数据值 p->data,然后将指针 p 移动到下一个节点 p->next。最后,在循环结束后,使用 printf 函数输出一个换行符,以便输出结果的格式化。
需要注意的是,代码中还有一些被注释掉的函数,包括 `CreateListR` 和 `ListEmpty`。这些函数分别用于使用尾插法创建单链表和判断链表是否为空。由于这些函数被注释掉了,所以在代码中并不会被调用到。
阅读全文