C语言的单链表问题,求助!
(1)定义单链表link1,用尾插入法创建link1,并输出创建后的link1元素序列。(2)计算link1的长度,并将结果存放在头结点的数据域中,然后输出单链表的所有元素(包含头结点,头结点作为第一个输出)
单链表的函数已完成,第二题求解,怎么调用函数?
从头开始写就太麻烦了,如果你会的话就
https://blog.51cto.com/13352079/2126869
参考上面代码改改吧{:10_256:} 理想小青年 发表于 2019-10-8 20:13
从头开始写就太麻烦了,如果你会的话就
https://blog.51cto.com/13352079/2126869
参考上面代码改改吧{:1 ...
头文件我已经完成了,只需要写主函数即可,第二问有点不知道怎么调用函数 #include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
//using namespace std;
typedefintelemtype;
typedefstructnode //结点类型定义
{
elemtypedata;
structnode*next;
} LinkList,node;
LinkList*Init_LinkList()/*初始化空的单链表*/
{ elemtypeix;
LinkList*head, *p;
head = (LinkList *) malloc ( sizeof( LinkList ) );
head->next = NULL;
return(head);
}
LinkList*Create_LinkListF()/*头插法建立带头结点的单链表函数*/
{ elemtypeix;
LinkList*head, *p;
head = (LinkList *) malloc ( sizeof( LinkList ) );
head->next = NULL;
printf("请输入数据直到输入0结束:\n");
scanf("%d", &ix);
while (ix != 0)
{ p = (LinkList *) malloc( sizeof( LinkList ) ); //①
p->data = ix; //②
p->next = head->next; //③
head->next = p; //④
scanf("%d", &ix);
}
return(head);
}
LinkList *Create_LinkListR( ) /*尾插法建立带头结点的单链表函数*/
{ elemtypeix;
LinkList*head, *p, *tail;
head = (LinkList *) malloc ( sizeof( LinkList ) );
head->next = NULL; tail = head;
printf("请输入数据直到输入0结束:\n");
scanf("%d", &ix);
while (ix != 0)
{ p = (LinkList *) malloc( sizeof( LinkList ) );
p->data = ix;
tail->next = p;
tail = p;
tail->next = NULL;
scanf("%d", &ix);
}
return( head );
}
void Print_LinkList( LinkList*head)//输出
{ LinkList*p = head->next;
while(p != NULL)
{ printf("%d ", p->data);
p = p->next;
}
}
int LinkList_Length (LinkList*head )//求长度
{ LinkList*p = head; /*p指向头结点*/
intj = 0;
while( p->next)
{ p=p->next; /*p所指的是第j个结点*/
j ++;
}
returnj;
}
//按序号查找: 从链表的第一个结点起,判断当前结点是否是第i个,
//若是,则返回该结点的指针,否则继续下一个,直到表结束为止。没有第i个结点时返回空。
LinkList *GetData_LinkList(LinkList *head, int i)//返回第i个节点的指针
{ LinkList *p; intj = 0;
if (i <= 0) return NULL;
p = head;
while( p->next && j < i )
{ p = p->next;
j ++;
}
if ( i == j) returnp;
else returnNULL;
}
//按值查找:
//从链表的第一个结点起,判断当前结点是否等于key,若是,则返回该结点的指针,
//否则继续下一个,直到表结束为止。找不到时返回空。
LinkList *Search_LinkList(LinkList*head, elemtypekey)//返回值为key的地址
{ LinkList *p;
p = head->next;
while( p)
if ( p->data != key )
p = p->next;
else
break;
returnp;
}
//后插运算算法
void InsertAfter_LinkList(LinkList *p, elemtypex)//在结点p后面插入值为x的节点
{ LinkList*s;
s = (LinkList *) malloc ( sizeof( LinkList ) );
// ①生成新结点
s->data = x; //②新结点赋值
s->next = p->next; //③新结点链入
p->next = s; //④修改前趋结点的后向链
}
//在指定位置i插入x
int InsertNo_LinkList(LinkList*head,elemtype x,int i)
{
LinkList*p;
if(i<=0)p=NULL;
else if(i==1)p=head;
else
p=GetData_LinkList(head,i-1);
if(p==NULL)
{
return 0;
}
else
{
InsertAfter_LinkList(p,x);
return 1;
}
}
//删除后继结点算法
/*删除p的后继结点,成功返回1;否则返回0*/
intDeleteAfter_LinkList(LinkList *p)
{ LinkList *r;
if ( !p ) { return 0;}
r = p->next;
if ( !r )
{ return 0; }
p->next = r->next;
free( r );
return( 1 );
}
//删除单边表head的指定结点p
int DeleteNode_LinkList(LinkList*head,LinkList*p)
{
LinkList*r;
if(p->next!=NULL)
{
p->data=p->next->data;
return(DeleteAfter_LinkList(p));
}
else
{
r=head;
while(r->next!=p)
r=r->next;
return(DeleteAfter_LinkList(r));
}
}
//删除指定位置的结点:在带头结点的链表中删除第i个结点。删除第i个结点,就必须找到它的前驱结点,
//即第i – 1个结点p,然后再删除p的后继结点。
intDeleteNo_LinkList( LinkList *head, inti ) /*删除成功返回1,否则返回0*/
{ LinkList *p, *r;
if ( i == 0)p = NULL;
else if (i == 1 ) p = head;
elsep = GetData_LinkList(head, i-1);/*搜索第i-1个结点*/
if ( p == NULL)
{
return 0;
}
else
{ r = p->next; p->next = r->next; /*删除指定结点*/
free( r );
return1;
}
}
//将已存在的单链表的所有结点删除,释放其所占用的存储空间,使其成为带头结点的空链表。
LinkList * SetNull_LinkList(LinkList *head)
{ while (head->next)
DeleteAfter_LinkList(head); /*依次删除每个结点*/
return head;
}
本帖最后由 superbe 于 2019-10-9 12:35 编辑
参考代码如下。我把LinkList_Length 和 Print_LinkList各修改了一行,因为题目说要包括头结点,你自己决定吧。
void Print_LinkList( LinkList*head)//输出
{ //LinkList*p = head->next;
LinkList*p = head;
while(p != NULL)
{ printf("%d ", p->data);
p = p->next;
}
}
int LinkList_Length (LinkList*head )//求长度
{ LinkList*p = head; /*p指向头结点*/
//intj = 0;
intj = 1;
while( p->next)
{ p=p->next; /*p所指的是第j个结点*/
j ++;
}
returnj;
}
int main()
{
LinkList *head;
head=Create_LinkListR(); //尾插法创建链表
head->data = LinkList_Length(head); //将链表长度存放在头结点的数据域
Print_LinkList(head); //输出单链表的所有元素
return 0;
}
页:
[1]