可以用递归的方法求链表的长度。
看了下代码,你创建链表的函数写的有问题。给你个链表操作的例子吧。代码如下:
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
using namespace std;
typedef struct node
{
int data;
struct node *next;
}*PNODE;
PNODE Create_list(void)
{
int i;
int a[]= {1,2,3,4,5,6,8,9,10,11,12,13,14,15,16,17,18,19,20,21};
PNODE head=(PNODE)malloc(sizeof(node));
if(NULL==head)
{
printf("内存分配失败,程序终止。\n");
exit(-1);
}
PNODE tail=head;
tail->next=NULL;
for(i=0; i<20; i++)
{
PNODE pnew=(PNODE)malloc(sizeof(node));
if(NULL==pnew)
{
printf("内存分配失败,程序终止。\n");
exit(1);
}
pnew->data=a[i];
pnew->next=NULL;
tail->next=pnew;
tail=pnew;
}
return head;
}
//传入链表的首地址,不是头指针的地址,相当于head->next
int Count_list(PNODE p)//用递归的方法求链表的长度
{
if(p==NULL) return 0;
else return (1+Count_list(p->next));
}
int Length_list(PNODE head)
{
int n=0;
PNODE p=head;
if(head==NULL) return 0;
while(NULL!=p->next)
{
n++;
p=p->next;
}
return n;
}
bool Insert_list(PNODE head,int pos,int value)//在pos位置上插入一个值为value的结点
{
PNODE p=head;
int i=0;
while(NULL!=p->next && i<pos-1)
{
p=p->next;
i++;
}
if(i>pos-1 && NULL==p)
return false;
PNODE pnode=(PNODE)malloc(sizeof(node));
if(NULL==pnode)
{
printf("内存分配失败,程序终止。\n");
exit(-1);
}
pnode->data=value;
pnode->next=p->next;
p->next=pnode;
return true;
}
bool Delete_list(PNODE head,int pos)//删除pos位置上的结点
{
PNODE p=head;
int i=0;
while(NULL!=p->next && i<pos-1)
{
p=p->next;
i++;
}
if(i>pos-1 && NULL==p)
return false;
PNODE node= p->next;//记录要删除的节点指针
p->next =node->next;
node->next=NULL;//将删除的节点的指针置为NULL
free(node);//释放删除的结点
return true;
}
void Display_list(PNODE head)//显示链表的内容
{
PNODE p=head;
while(NULL!=p->next)
{
printf("%d ",p->next->data);
p=p->next;
}
}
void Free_list(PNODE head)//释放链表
{
PNODE f,p=head->next;
free(head);
int i=0;
while(NULL!=p)
{
i++;
printf("%d ",p->data);
f=p->next;
free(p);//释放链表中的结点
p=f;
}
printf("\n%d个指针全部释放完毕!\n\n",i);
}
int main(void)
{
PNODE head=Create_list();//创建链表并返回链表的头指针
printf("创建的链表内容如下:\n");
Display_list(head);
printf("\n链表的长度为:%d",Count_list(head->next));
printf("\n链表中结点的个数为:%d\n",Length_list(head));
printf("\n插入结点之后的链表内容如下:\n");
Insert_list(head,7,7);//在位置7的地方插入结点值为7的结点
Insert_list(head,13,72);
Insert_list(head,15,73);
Insert_list(head,17,74);
Insert_list(head,19,75);
Insert_list(head,23,76);
Display_list(head);
printf("\n链表的长度为:%d",Count_list(head->next));
printf("\n链表中结点的个数为:%d\n",Length_list(head));
printf("\n删除结点之后的链表内容如下:\n");
Delete_list(head,11);//删除位置11处的结点
Display_list(head);
printf("\n链表的长度为:%d",Count_list(head->next));
printf("\n链表中结点的个数为:%d\n\n",Length_list(head));
Free_list(head);//释放链表
return 0;
}
[
本帖最后由 303770957 于 2013-9-13 02:41 编辑 ]