求大神帮忙。c语言,求单链表的长度。

求大神帮忙。c语言,求单链表的长度。,第1张

typedef struct LNode

{

int date

struct LNode *next

} LNode, *LinkList /*线性链表类型 */

typedef int Status

int CreatLinkList_L(LinkList &L)/*逆位序输入n个元素的值,建立带头节点的单链线性表L */

{

int i,n

printf("输入n的值")

scanf("%d",&n)

LinkList p, p2

L=(LinkList)malloc(sizeof(LNode))

L->next=NULL/*先建立一个带头节点的单链表*/

p2 = L

for(i=ni>0--i)

{

p = (LinkList)malloc(sizeof(LNode))

scanf("%d",&(p->date))

p->next = p2->next

p2->next = p

}

return OK

}

Status ListLength_L(LinkList L)

{

int i=0

LinkList p = L

p = p->next

while(p!=NULL)

{

printf("%d\n", p->date)

p = p->next

i++

}

return i

}

void DeleteLinkList_L(LinkList L)

{

LinkList p = L->next

while(p)

{

free(L)

L = p

p = L->next

}

}

void main()

{

LinkList L = NULL

CreatLinkList_L(L)

printf("%d\n", ListLength_L(L))

DeleteLinkList_L(L)//动态分配的内存应主动释放

}

int Length(SNode *L)

{

int n=0

SNode *q=L->next

while(q!=NULL)

{n++

q=q->next

}

printf("该链表的长度为:%d\n",n)//这行少个%d

return n

}

这个函数要返回链表的长度n

//兄弟,好好看看带头结点和不带头结点的链表的区别,还有如果你设了全局变量n记录链表长度,length()这个函数就多余了,你可以在删除数据时把n-1,插入数据时把n+1就行了,我简单改了改,你看看吧!!

#include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

typedef struct node

{

int data

struct node *next

}slink

int n

slink *creat() //创建链表

int insert(slink *head,int i,int x)//在结点i之前播放一个数x

int del(slink *head,int i,int *x) //删除第i个结点并返回该结点上的数值

slink *get(slink *head,int i) //查找第i个结点,并返回

int length(slink *head) //求链表的长度

void print(slink *head) //输出链表

int main()

{

slink *head

int de,num=0,ins,len //de为要删除的结点,ins为要插入的结点

//这里num要用整形数,不用指针

printf("input records:\n")

head=creat()

print(head)

printf("\ninput the delete number:(the number<%d)",n)

scanf("%d",&de) //这里少了一个&符

if(del(head,de,&num)==1)

{

print(head)

printf("%d",num)

}

else

printf("delete failure!")

printf("\ninput the inset record:")

scanf("%d",&ins)

if(insert(head,2,ins)==1)

print(head)

else

printf("the insert is failure!")

len=length(head)

printf("the length is %d\n",len)

return 0

}

slink *creat() /*定义函数,返回带头结点的链表*/ //兄弟,你建的是不带头结点的链表,带头结点的链表的头结点是不存数据的!!!

{

slink *head

slink *p1,*p2

n=0

head=NULL

p1=p2=(slink*)malloc(sizeof(slink))

scanf("%d",&p1->data)

while(p1->data!=0)

{

n=n+1

if(n==1) head=p1

else p2->next=p1

p2=p1

p1=(slink*)malloc(sizeof(slink))

scanf("%d",&p1->data)

}

p2->next=NULL

return (head)

}

int insert(slink *head,int i,int x)

{

slink *p,*pre,*q

int j=0

p=(slink*)malloc(sizeof(slink))

p->data=x

pre=head/*pre指向待插入结点的前驱结点*/

q=head->next /*q指向当前比较结点*/

while(q&&j<i-1) /*查找p结点应该插入的位置*/

{pre=q

q=q->next

j++

}

if(j!=i-1||i<1) return 0 /*插入不成功*/

else

{p->next=q /*将p结点插入链表*/

pre->next=p

}

return 1 /*插入成功*/

}

int del(slink *head,int i,int *x)/*删除第i个结点,并通过x返回值*/

{

slink *p,*q

int j=0

p=head

while(p->next&&j<i-1) /*查找第i个结点的前驱位置p*/

{

p=p->next

j++

}

if(!(p->next)||j>i-1) return 0 /*删除位置不合适*/

q=p->next /*删除并释放结点*/

p->next=q->next

*x=q->data

free(q)

n-- //删除了数据,总数n应该减1吧?

return 1

}

slink *get(slink *head,int i) /*查找第i个结点*/

{slink *p

int j=0

p=head

while(p->next&&j<i-1) /*查找第i个结点的前驱*/

{p=p->nextj++}

if(!(p->next)&&j>i-1) return NULL

return p->next

}

int length(slink *head) /*求表的长度*/

{int len=0

slink *p

p=head /*设该表有表头*/

while(p){p=p->nextlen++} //你建的是不带头链表,所以这里少了一个

return len

}

void print(slink *head)

{slink *p

printf("\nNow,these %d records are :\n",n)

p=head

if(head!=NULL)

do

{printf("%d \n",p->data)

p=p->next

}while(p!=NULL)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11883535.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存