求单链表的长度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求单链表的长度相关的知识,希望对你有一定的参考价值。

求带头结点的单链表的长度,并将长度保存到结点中。谢谢高手!小妹急用…

struct node
int data;
struct node *next;
;

创建单链表后,最后一个结点的next是NULL,据此来遍历表,获得长度。

void get_len( struct node *head )

struct node *p=head->next ;
int len=0;
while ( p )

len++;
p=p->next;

head->data=len ; //存储长度到头结点
追问

那个中文是什么意思?创建单链表后,最后一个结点的next是NULL,据此来遍历表,获得长度。
这个程序就这么短?

追答

呵呵,我的意思是你先要建立起链表来之后,用这个代码就可以得到链表的长度。
你不会链表一点都不清楚吧?

追问

我真的都不懂。。。
能给个最完整的吗?

追答

//定义一个结点结构
struct node
int data; //数据,可以是任何复杂类型数据
struct node *next; //结点间连接的指针,用来指向下一个结点,通过next可以找到下一个结点,为NULL时,表示到了表尾
;

void creat_link ( struct node *h , int n )

struct node *tail=h , *p=NULL ;
int i;
for( i=0;idata=i+1 ;
//将新结点追加到表尾,即当前表尾的next指向p
tail->next=p;
//将p置为当前尾结点
tail=p;

tail->next=NULL; //表尾标志

void free_link ( struct node *h )

struct node *p ;
while ( h )

p=h ; //记下要释放的结点
h=h->next ; //表头指针指向下一个结点
free(p);//释放当前结点


void output ( struct node *h )

struct node *p=h->next ; //p指向第一个数据结点
while ( p )

printf("data=%d\n" , p->data ); //输出结点数据
p=p->next ; //数据指针指向下一个结点



void get_len( struct node *head )

struct node *p=head->next ;
int len=0;
while ( p )

len++;
p=p->next;

head->data=len ; //存储长度到头结点


//创建一个带表头结点的链表
int main()

struct node *head=NULL ;
int num=3; //数据结点个数
head=(struct node *)malloc( sizeof(struct node) ); //创建一个表头结点
creat_link( head , num ); //创建一个链表,包括三个数据结点
output( head ); //遍历链表
free_link( head ); //释放链表
return 0;

好好学习,有问题再追问,慢慢来,祝你进步

参考技术A int Length_LinkList (LinkList H) /*求链表长度*/

LinkList p=H; //p指向头结点
int j=0; //结点计数器j归零
while (p->next!=NULL) //当p结点的后继结点存在

j++; //计数器+1
p=p->next; //指针后移

return j;
参考技术B 你好!
我给你简单写了个程序,
其中链表的长度保存在头结点中
希望能满足你的要求

# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>

typedef struct Node

int data;
struct Node * pNext;
NODE,* PNODE;

PNODE create_list(void);//创建一个链表
void traverse_list(PNODE pHead);//遍历链表
int length_list(PNODE pHead);//求链表的长度
int length_list(PNODE pHead);//获取链表长度

int main(void)

PNODE pHead = NULL;

printf("创建链表:\n");
pHead = create_list();

printf("遍历链表:\n");
traverse_list(pHead);

int length = length_list(pHead);
printf("所创建的链表的长度是%d\n", length);

return 0;

PNODE create_list(void)

int len;//链表中节点数目
int i;
int val;

PNODE pHead = (PNODE)malloc(sizeof(NODE));
if (NULL == pHead)

printf("分配内存失败!程序终止!");
exit(-1);

PNODE pTail = pHead;
pTail->pNext = NULL;

printf("请输入要创建的链表中节点的个数len=");
scanf("%d",&len);

for (i=0;i<len;++i)

printf("请输入第%d个节点的有效数据:",i+1);
scanf("%d",&val);

PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew)

printf("分配内存失败!程序终止!");
exit(-1);

pNew->data = val;
pTail->pNext = pNew;
pNew->pNext = NULL;
pTail = pNew;


return pHead;

void traverse_list(PNODE pHead)

PNODE p = pHead->pNext ;

while (NULL != p)

printf("%10d",p->data);
p = p->pNext;

printf("\n");

return ;

int length_list(PNODE pHead)//求链表的长度

int len = 0;
PNODE p = pHead->pNext ;

while (NULL != p)

++len;
p = p->pNext ;

pHead->data = len;
return pHead->data; //将求得到链表的长度保存到头结点中


/*
在vc++6.0中的输出结果:
-----------
创建链表:
请输入要创建的链表中节点的个数len=5
请输入第1个节点的有效数据:1
请输入第2个节点的有效数据:2
请输入第3个节点的有效数据:3
请输入第4个节点的有效数据:4
请输入第5个节点的有效数据:5
遍历链表:
1 2 3 4 5
所创建的链表的长度是5
-----------------
*/

仅供参考!呵呵

4-3 求链式表的表长 (10分)

本题要求实现一个函数,求链式表的表长。

函数接口定义:

int Length( List L );

其中List结构定义如下:

typedef struct LNode *PtrToLNode;
struct LNode {
    ElementType Data;
    PtrToLNode Next;
};
typedef PtrToLNode List;

L是给定单链表,函数Length要返回链式表的长度。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;
typedef struct LNode *PtrToLNode;
struct LNode {
    ElementType Data;
    PtrToLNode Next;
};
typedef PtrToLNode List;

List Read(); /* 细节在此不表 */

int Length( List L );

int main()
{
    List L = Read();
    printf("%d\n", Length(L));
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

1 3 4 5 2 -1

输出样例:

5

代码展示:
 1 List Read()
 2 {
 3     PtrToLNode head = NULL;
 4     PtrToLNode list = NULL;
 5     int data;
 6     scanf("%d",&data);
 7     if(data!=-1)
 8     {
 9         head = (PtrToLNode)malloc(sizeof(struct LNode));
10         head->Data = data;
11         head->Next = NULL;
12         list=head;
13     }
14     scanf("%d",&data);
15     while(data!=-1)
16     {
17         PtrToLNode node = NULL;
18         node = (PtrToLNode)malloc(sizeof(struct LNode));
19         node->Data = data;
20         node->Next = NULL;
21         list->Next = node;
22         list = node;
23         scanf("%d",&data);
24     }
25     return head;
26 }
27 int Length( List L )
28 {
29     int len= 0;
30     while(L)
31     {
32         len++;
33         L = L->Next;
34     }
35     return len;
36 }

 

以上是关于求单链表的长度的主要内容,如果未能解决你的问题,请参考以下文章

单链表的基础操作

快速找到未知长度的单链表的中间结点

数据结构之单链表

数据结构之单链表

轻松实现单链表——Java

快速找到未知长度单链表的中间节点