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 10:25:52 浏览: 191
这段代码是用于初始化一个空的线性链表,并且实现了创建一个节点的函数。
函数`InitList`接受一个指向指针的指针`L`作为参数,用于修改指针`L`所指向的值。它首先使用`malloc`函数为头结点`p`分配内存空间,如果内存分配成功,则将头结点的`next`指针指向NULL,将头结点赋值给链表的`head`和`tail`指针,并将链表的长度初始化为0。最后,返回一个代表成功的状态值OK。如果内存分配失败,则返回一个代表错误的状态值ERROR。
函数`MakeNode`接受一个指向指针的指针`p`和要存储的元素`e`作为参数,用于修改指针`p`所指向的值。它使用`malloc`函数为新节点分配内存空间,如果内存分配成功,则将新节点的数据域赋值为`e`,并返回一个代表成功的状态值OK。如果内存分配失败,则返回一个代表错误的状态值ERROR。
需要注意的是,这段代码中没有对内存分配是否成功进行判断。在实际应用中,应该增加对内存分配的判断,确保内存分配成功后再进行后续操作。另外,可以看出这段代码是基于线性链表的实现,其中头结点既作为链表的起始节点,也作为链表的尾节点,通过`head`和`tail`指针来标记链表的头部和尾部。
相关问题
给定一个带头结点的单链表,写一个函数查找其最小值,并将最小值结点挪到链表的头部。 【输入形式】 链表L长度 链表L,以空格区分 【输出形式】 最小值 链表,以空格区分 【样例输入】 3 5 1 3 【样例输出】 1 1 5 3 【代码框架】 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #define ERROR 0 #define OK 1 #define TRUE 1 #define FALSE 0 typedef int ElemType; typedef int Status; // definition of node structure of singly linked list typedef struct L_node { ElemType data; // data field struct L_node *next; // pointer field }LNode, *LinkedList; //=========================================== // Initialize a singly linked list L with head node //=========================================== Status InitList_L(LinkList &L) { } //=========================================== // Create a singly linked list L with head node, and with n elements //=========================================== Status CreateList_L(LinkList &L, ElemType a[ ], int n) { } //=========================================== // 查找链表的最小值结点,并将其挪到链表的头部 //=========================================== void MoveMaxNode_L(LinkList &L, ElemType &maxval) { } //====================================== // Print the elements in a list //======================================= void LinkedListPrint(LinkedList L) { } int main() { }
为了实现题目要求的功能,我们需要完成以下几个步骤:
1. 初始化一个带头节点的单链表。
2. 创建包含n个元素的单链表(从用户输入获取)。
3. 实现函数`MoveMinNode_L()`用于找到最小值节点并把它移到头结点之后的位置。
4. 打印输出链表的内容。
下面是具体的代码及说明:
```c
#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef int Status;
// 定义单链表节点结构体
typedef struct L_node {
ElemType data; // 数据域
struct L_node* next;// 指针域
} LNode, *LinkList;
//初始化一个带表头的空链表
Status InitList_L(LinkList& L) {
L = (LinkList)malloc(sizeof(LNode));
if (!L)
return ERROR;
L->next = NULL;
return OK;
}
//创建具有n个元素的单链表(尾插法), 元素存储于数组a中
Status CreateList_L(LinkList& L, ElemType a[], int n) {
LinkList p, r=L; //r为指向新插入位置前驱的工作指针
for(int i=0;i<n;++i){
p=(LinkList)malloc(sizeof(LNode));
p->data=a[i];
p->next=NULL;
r->next=p;
r=r->next;
}
r->next=NULL;
return OK;
}
// 查找链表中的最小值并将该节点移动到最前面
void MoveMinNode_L(LinkList& L, ElemType &minVal) {
LinkList minPrev = L, curP = L->next, prev = L, temp;
minVal = curP->data;
while(curP != NULL && curP->next!=NULL){
if(minVal > curP->next->data){
minPrev = curP;
minVal = curP->next->data;
}
curP = curP->next;
}
// 如果找到了更小的数,则进行交换操作
if(minPrev->next != L->next){
temp=minPrev->next;
minPrev->next=temp->next;
temp->next=L->next;
L->next=temp;
}
}
//打印链表内容
void LinkedListPrint(LinkList L) {
L = L -> next ; //跳过头结点
while (L != NULL) {
printf("%d ", L->data);
L = L->next;
}
printf("\n");
}
int main(){
int length,i,minValue;
scanf("%d", &length);
ElemType arr[length]; // 使用数组储存读入的数据
for(i=0; i<length; ++i){
scanf("%d",&arr[i]);
}
LinkList mylinklist;
InitList_L(mylinklist); // 初始化链表
CreateList_L(mylinklist,arr,length); // 构建链表
MoveMinNode_L(mylinklist,minValue); // 移动最小值至首位且获得其值
printf("%d\n", minValue);
LinkedListPrint(mylinklist); // 输出处理后的结果
return 0;
}
```
这段程序完成了题目的所有需求:接收用户输入、建立带有虚拟头结点的单向链表、查找链表内最小数值所在的节点并且把那个节点移置列表前端,以及展示最终的结果。
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。
阅读全文
相关推荐

















