void Init(LinkList *L) { *L = (LinkList)malloc(sizeof(LLinkList)); if(!(*L)) { printf("创建头节点失败\n"); exit(1); } else (*L)->next = NULL; }
时间: 2024-03-12 14:47:22 浏览: 89
这是一个初始化带头结点的单链表的函数,函数名为Init,参数为LinkList *L,其中LinkList是指向单链表结点的指针类型,定义如下:
```
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode, *LinkList;
```
函数实现步骤为:
1. 为头结点申请内存空间,大小为结点类型LLinkList所占的字节数,即sizeof(LLinkList);
2. 判断头结点是否申请成功,如果申请失败,输出提示信息"创建头节点失败",并退出程序;
3. 如果头结点申请成功,将头结点的指针域next置为NULL,表示单链表为空链表。
该函数的作用是初始化一个带头结点的单链表,为其创建一个头结点并将其置为空链表。
相关问题
#include <stdio.h> #include<stdlib.h> typedef struct Node { int data; struct Node *next; } LinkList; void Create(LinkList *L,int a[],int n) { int i; LinkList *s,*r; L=(LinkList *)malloc(sizeof(LinkList)); L->data=a[0]; L->next=NULL; r=L; for(i=1; i<n; ++i) { s=(LinkList *)malloc(sizeof(LinkList)); s->data=a[i]; r->next=s; r=s; } r->next=NULL; } int count(LinkList *L) { if(L==NULL) return 0; else return count(L->next)+1; } void DispList(LinkList *L) { if(L == NULL) return; else { count(L->data); // 调用计数函数 DispList(L->next); // 递归遍历链表 } } int main() { LinkList *L; int a[10]= {1,2,3,4,5,6,7,8,9,10};//作为预设单链表中的data值 Create(L,a,10);//尾插法将a数组中的值插入链表 printf("单链表为: %d\n"); DispList(L); printf("节点个数为:\n"); return 0; }
这段代码存在问题,主要是在 Create 函数中传入的 LinkList 指针没有被正确赋值,导致后续的操作都无法进行。此外,在 main 函数中调用 DispList 函数时没有传入链表指针,应该传入 L。下面是修改后的代码:
```
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
} LinkList;
void Create(LinkList **L, int a[], int n)
{
int i;
LinkList *s, *r;
*L = (LinkList *)malloc(sizeof(LinkList));
(*L)->data = a[0];
(*L)->next = NULL;
r = *L;
for(i = 1; i < n; ++i)
{
s = (LinkList *)malloc(sizeof(LinkList));
s->data = a[i];
r->next = s;
r = s;
}
r->next = NULL;
}
int count(LinkList *L)
{
if(L == NULL)
return 0;
else
return count(L->next) + 1;
}
void DispList(LinkList *L)
{
if(L == NULL)
return;
else
{
printf("%d ", L->data); // 输出当前节点的值
DispList(L->next); // 递归遍历链表
}
}
int main()
{
LinkList *L;
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 作为预设单链表中的data值
Create(&L, a, 10); // 尾插法将a数组中的值插入链表
printf("单链表为: ");
DispList(L);
printf("\n节点个数为:%d\n", count(L));
return 0;
}
```
这个程序的作用是创建一个单链表,然后输出链表中的元素,并统计链表中节点的数量。程序中使用了尾插法创建链表,递归遍历链表输出元素,递归计算链表中节点数量等操作。
//单链表元素求和,并将累加和添加到单链表尾部 //如果操作成功,返回OK,否则返回ERROR int AppendSumToList(LinkList* L) { int sum=0; LinkList r = *L; while (r!= NULL) { sum = sum + (*L)->data; r = r->next; } LinkList p = (LinkList)malloc(sizeof(LNode)); p->data = sum; p->next = NULL; r->next = p; r = p; return OK; }这个代码是否有错
这个代码有错,因为在执行完while循环后,r指向的是链表的最后一个节点,而不是空节点。因此,在创建新节点p并将其添加到链表尾部时,需要将r指向新节点p,才能保证链表尾部正确。
以下是修改后的代码:
```
// 单链表元素求和,并将累加和添加到单链表尾部
// 如果操作成功,返回OK,否则返回ERROR
int AppendSumToList(LinkList* L) {
int sum = 0;
LinkList r = *L;
while (r != NULL) {
sum = sum + r->data;
r = r->next;
}
LinkList p = (LinkList)malloc(sizeof(LNode));
p->data = sum;
p->next = NULL;
if (*L == NULL) {
*L = p;
} else {
r->next = p;
}
return OK;
}
```
修改后的代码中,如果链表为空,则将新节点p作为链表的头节点;否则将新节点p添加到链表尾部。
阅读全文