大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
只需要把函数返回值定义为链表节点的指针类型即可。
10年积累的网站设计、成都做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有二连浩特免费网站建设让你可以放心的选择与我们合作。
以下为实例代码。
#include stdio.h
#include stdlib.h
struct node
{
int v;
struct node *next;
};
struct node * make_head(void)//函数功能,返回一个链表的头节点
{
struct node *ret;
ret = malloc(sizeof(struct node));//申请一个头节点空间,
ret-next = NULL;
return ret;//返回头节点。
}
调用make_head得到的返回值,就是用来标记一个链表起始的头节点。
在实际应用中,返回链表的实现方式有很多种,功能也各不相同,但原理都是一样的。
#includestdio.h#includewindows.h#include stdio.h#include malloc.h#include stdlib.h//定义数据类型名称typedef int DataType;#define flag -1 //定义数据输入结束的标志数据//单链表结点存储结构定义typedef struct Node{ DataType data; struct Node *next;}LNode ,*LinkList;//建立单链表子函数 LNode *Create_LinkList(){ LNode *s,*head,*L;int i=0,x; //定义指向当前插入元素的指针 while(1) { scanf("%d",x); if(-1==x) { return head; break;} s= (LNode *)malloc(sizeof(LNode)); //为当前插入元素的指针分配地址空间 s-data =x; s-next =NULL; i++; if(i==1) head=s; else L-next =s; L=s; }}//查找子函数(按序号查找)LNode *Get_LinkList(LinkList L,int i){ LNode *p; int j; //j是计数器,用来判断当前的结点是否是第i个结点 p=L; j=1; while(p!=NULLji) { p=p-next ; //当前结点p不是第i个且p非空,则p移向下一个结点 j++; } return p;}//插入运算子函数void Insert_LinkList(LinkList L,int i,DataType x) //在单链表L中第i个位置插入值为x的新结点{ LNode *p,*s; p =Get_LinkList(L,i); //寻找链表的第i-1个位置结点 if(p==NULL) { printf("插入位置不合法!"); exit(-1); } else { s= (LinkList)malloc(sizeof(LNode)); //为当前插入元素的指针分配地址空间 s-data =x; s-next =p-next ; p-next =s; }}//单链表的删除运算子函数void Delete_LinkList(LinkList L,int i) //删除单链表上的第i个结点{ LNode *p,*q; p=Get_LinkList(L,i-1); //寻找链表的第i-1个位置结点 if(p==NULL) { printf("删除的位置不合法!"); //第i个结点的前驱结点不存在,不能执行删除操作 exit(-1); } else { if(p-next ==NULL) { printf("删除的位置不合法!"); //第i个结点不存在,不能执行删除操作 exit(-1); } else { q=p-next ; p-next =p-next-next; free(q); } }}//求表长运算子函数int Length_LinkList(LinkList L){ int l; //l记录L的表长 LNode *p; p=L; l=1; while(p-next) { p=p-next; l++; } return l;}int main (){ LNode *head,*p; head=(LinkList)malloc(sizeof(LNode)); int x,y; a: printf("*******menu*******\n"); printf("**创建**********1*\n"); printf("**插入**********2*\n"); printf("**删除**********3*\n"); printf("**表长**********4*\n"); printf("**清屏**********5*\n"); printf("**打印**********6*\n"); printf("**退出******other*\n"); printf("******************\n"); int i=1; while(i) { printf("请输入选项:"); scanf("%d",i); switch(i) { case 1:head=Create_LinkList(); getchar();break; case 2:printf("请输入位置和数据;"); scanf("%d%d",x,y); Insert_LinkList(head,x,y);break; case 3:printf("请输入位置;"); scanf("%d",x); Delete_LinkList(head,x);break; case 4:printf("%d",Length_LinkList(head));break; case 5:system("cls");goto a; case 6:p=head; while(p!=NULL) {printf("%d\n",p-data); p=p-next;} break; default :i=0; } }}
我把创建给改了一下
你是C语言,C语言是面向过程的,测试人员是要考虑内部实现的。
C++的话用动态数组vector即可实现
1、添加头文件"stdio.h"
2、struct student * creat(void),但是你的main函数中返回接收却是用的int*类型。
3、主函数main应当明确声明为void main()
4、最为严重的是:struct student * creat(void) 函数体中使用了局部变量struct student *head; struct student *p1,*p2; 但是函数结束的地方却要返回这些指针,因此返回的值是无效数据。返回时,已经不再作用域了,是无效的空间。建议把这些数据当作输入参数,指针类型的。就可以正确的接收分配的struct student空间以及指针了。
5、struct student * creat(void) 函数体中,临时指针*p1、*p2再函数返回之前应当设置为NULL,避免因为局部变量的作用域结束导致相关的空间被清除。
总之,我建议把struct student * creat(void)定义修改为:
void creat(struct student **head).
以上内容经过调试,可以使用。
==================我的程序,经过完整的调试
#include "stdafx.h"
#include "malloc.h"
#include "stdio.h"
#define NULL 0
#define LEN sizeof(struct student)
struct student
{
long num;
float score;
struct student *next;
};
int n;
void creat(struct student **head) /*定义函数,此函数带回一个指向链表头的指针*/
{
struct student *p1,*p2;
n=0;
do
{
p1=(struct student *)malloc(LEN); /*开辟一个新单元*/
p1-next=NULL;
scanf("%ld,%f",p1-num,p1-score);
if(p1-num==0)
break;
n++;
if(n==1)
*head=p1;
else
p2-next=p1;
p2=p1;
} while(p1-num!=0) ;
p1=NULL;
p2=NULL;
}
void main()
{
struct student *p;
creat(p);
if(p!=NULL)
do
{
printf("%ld %5.1f\n",p-num,p-score);
p=p-next;
}while(p!=NULL);
flushall(); //清除键盘缓冲区,避免输入混淆
getchar(); //等待键盘任意输入,以便观察运算结果
}
看我的回答怎么样?