{
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)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)