int listlength(slnode *head){ slnode *p=head; int size=0; while(p->next!=NULL) { size++; p=p->next; } return size; }
时间: 2024-03-15 19:43:31 浏览: 18
这是一个函数,名为 `listlength`,它接受一个指向单向链表头结点的指针 `head` 作为参数,并返回链表中节点的数量。
函数的实现过程如下:
1. 定义一个指向头结点的指针 `p`,并将其初始化为 `head`。
2. 定义一个整型变量 `size`,并将其初始化为 0。
3. 进入循环,循环条件为 `p` 的下一个节点不为 `NULL`。
4. 在循环体内,将 `size` 自增 1,表示当前节点是链表中的一个节点。
5. 将 `p` 指向下一个节点,继续遍历链表。
6. 当循环结束时,返回 `size`,即链表中节点的数量。
需要注意的是,这个函数没有考虑头结点本身是否为链表中的节点,因此在计算链表长度时,头结点也会被算作一个节点。如果头结点不算作链表中的节点,需要在循环体内将 `size` 初始化为 1。
相关问题
LinkList joseph(LinkList S,int m) { int i,len; LinkList p; i=1; len=ListLength(S); p=S; while(p->next!=S) p=p->next;//把p指向第一个结点的前驱 while(len>1){
这是一个约瑟夫问题的解法,使用循环链表来实现。具体实现细节可以参考代码:
LinkList joseph(LinkList S, int m) {
int i, len;
LinkList p, q;
i = 1;
len = ListLength(S);
p = S;
while (p->next != S) p = p->next; // 把p指向第一个结点的前驱
while (len > 1) {
for (i = 1; i < m; i++) {
p = p->next;
}
q = p->next;
p->next = q->next;
len--;
free(q);
}
return p;
}
这个函数的作用是解决约瑟夫问题,其中参数S是一个循环链表的头结点,m是每次删除的数的个数。函数返回最后剩下的结点。
注意,这个函数的实现并不完整,需要自己实现一些辅助函数,比如ListLength等。
typedef struct Lnode { struct Lnode* next; int data; }Lnode, * LinkList; void InitList(LinkList & L) { L = new Lnode; L->next = NULL; }
L)
{
L = NULL; // 将头指针置为 NULL,表示链表为空
}
void CreateList(LinkList& L, int n)
{
Lnode* p, * q;
L = new Lnode; // 创建头结点
L->next = NULL;
q = L;
for (int i = 0; i < n; i++)
{
p = new Lnode; // 创建新节点
cin >> p->data;
p->next = NULL;
q->next = p;
q = p; // 将新节点插入到链表尾部
}
}
void DestroyList(LinkList& L)
{
Lnode* p, * q;
p = L;
while (p != NULL)
{
q = p->next;
delete p;
p = q; // 释放链表中所有节点的内存空间
}
L = NULL;
}
int ListLength(LinkList L)
{
int len = 0;
Lnode* p = L;
while (p->next != NULL)
{
len++;
p = p->next;
}
return len;
}
bool ListEmpty(LinkList L)
{
return L->next == NULL;
}
void GetElem(LinkList L, int i, int& e)
{
Lnode* p = L->next;
int j = 1;
while (p != NULL && j < i)
{
p = p->next;
j++;
}
if (p == NULL || j > i)
{
cout << "Error: out of range" << endl;
return;
}
e = p->data;
}
int LocateElem(LinkList L, int e)
{
Lnode* p = L->next;
int i = 1;
while (p != NULL && p->data != e)
{
p = p->next;
i++;
}
if (p == NULL)
return 0;
else
return i;
}
void ListInsert(LinkList& L, int i, int e)
{
Lnode* p = L;
int j = 0;
while (p != NULL && j < i - 1)
{
p = p->next;
j++;
}
if (p == NULL || j > i - 1)
{
cout << "Error: out of range" << endl;
return;
}
Lnode* q = new Lnode;
q->data = e;
q->next = p->next;
p->next = q; // 在第 i 个位置插入元素 e
}
void ListDelete(LinkList& L, int i, int& e)
{
Lnode* p = L;
int j = 0;
while (p->next != NULL && j < i - 1)
{
p = p->next;
j++;
}
if (p->next == NULL || j > i - 1)
{
cout << "Error: out of range" << endl;
return;
}
Lnode* q = p->next;
e = q->data;
p->next = q->next;
delete q; // 删除第 i 个位置的元素,并将其值赋给 e
}
void ListTraverse(LinkList L)
{
Lnode* p = L->next;
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}