您的位置:

c语言returnhead,C语言return true

本文目录一览:

请帮我解决在c语言链表中代码:return head; 有什么作用!

就是你的链表的表头了,链表好比一条绳索,这是绳索的一头,你只有找到这一头才能继续往下面查找其他的,好比顺藤摸瓜。。。。。

c语言链表插入一个新节点的函数问题

首先,主函数中,“请输入插入的数据”那里scanf应该是b,这是引发崩溃的原因。

其次,insert函数的目的应该是想插入数据后仍是有序链表。但你的insert函数逻辑太乱,有些不必要的判断,我修正了你的代码,贴给你看看。(虽然你insert是想保证有序,但你在创建的时候没有保证有序,所以最终结果不一定是有序。例如,创建 1,5,2,插入3,最后输出的是 1,3,5,2)

代码修改:

scanf("%d", b);

重写了insert函数,简化逻辑;

动态分配的内存记得释放,增加freeNode释放空间

#include stdio.h

#include stdlib.h

struct link

{

int data;

struct link *next;

};

struct link *add(struct link *head);//创建链表 

void display(struct link *head);//输出数据 

struct link *insert(struct link *head, int b); //插入新节点 

void freeNode(struct link *); //释放空间

int main()

{

char c;

struct link *head = NULL;

printf("要创建一个链表吗?");

scanf(" %c", c);

while (c == 'y' || c == 'Y')

{

head = add(head);

printf("要继续创建节点吗?");

scanf(" %c", c);

}

display(head);

int b;

printf("输入插入的数据");

scanf("%d", b);

head = insert(head, b);

display(head);

freeNode(head);

}

struct link *add(struct link *head)

{

int data;

struct link *p = (struct link*)malloc(sizeof(struct link));

if (head == NULL)

{

head = p;

}

else

{

struct link *pr = head;//一个临时指针pr先保存下head的地址 

while (pr-next != NULL)

{

pr = pr-next;

}

pr-next = p;

}

printf("输入数据");

scanf("%d", p-data);

p-next = NULL;

return head;

}

void display(struct link *head)

{

struct link *pr = head;

while (pr != NULL)

{

printf("%d\n", pr-data);

pr = pr-next;

}

}

struct link *insert(struct link *head, int b)

{

struct link *ptr = head, *prev = head;

struct link *newNode = (struct link *)malloc(sizeof(struct link));

newNode-data = b;

while (ptr  b  ptr-data) {

prev = ptr;

ptr = ptr-next;

}

newNode-next = ptr;

if (ptr == head) head = newNode;

else prev-next = newNode;

return head;

}

void freeNode(struct link *node) {

if (!node) return;

freeNode(node-next);

free(node);

}

C语言链表问题

head-next=NULL; /*头结点next指针置为空*/

tail=head; /*开始时尾结点指向头结点*/

这个是你开始的时候建设的head指针对吧,它的实际内容里面没有数据,只有他的next指向一个NULL,之后你不断添加元素的时候,这个head里面数据始终是空的,所以下面用了这几句话来删除这个空的头节点:

pNewElement=head;

head=head-next; /*修正头指针的位置*/

free(pNewElement); /*释放资源*/

return head;

这几句话的作用也就是把head往后移动一个节点(删除你产生链表时候的头结点),这样的话,返回的链表的头节点的元素就是有学生信息的,希望你看懂了。

c语言程序设计 实现一个链表的插入,删除,输出 结果这个代码输出时老是出错,求帮忙

按照阁下的代码,我又写了一遍

直接就可以用

#includestdio.h

#includestdlib.h

typedef struct listnode

{

int data;

struct listnode *next;

}

linknode,*linklist;

/***************

* 建立链表

***************/

linklist creatlist(int length)

{

int number;

linklist head = (listnode *) malloc(sizeof(listnode));

listnode *p = head;

printf("请输入链表中的元素:\n");

for(int i = 0; i length; i++)

{

scanf("%d",number);

p-data = number;

p-next = (listnode *) malloc(sizeof(listnode));

p = p-next;

}

return head;

}

/***************

* 插入

***************/

linklist insertlist(linklist head, int pos)

{

int n;

listnode *q = (linklist) malloc(sizeof(linknode));

listnode *p = head;

printf("\n请输入插入的数值:\t");

scanf("%d",n);

for(int i = 0; i pos-1; i++)

p = p-next;

q-data = n;

q-next = p-next;

p-next = q;

return head;

}

/***************

* 删除

***************/

linklist deletelist(linklist head, int pos)

{

listnode *p = head,*q;

for(int i = 0; i pos-2; i++)

p = p-next;

q = p-next;

p-next = q-next;

free(q);

return head;

}

/***************

* 输出

***************/

void output(linklist head)

{

linklist p = head;

while(p!=NULL)

{

printf("%d ",p-data);

p = p-next;

}

}

/***************

* 主函数

***************/

int main()

{

linklist head;

int l,a,b;

printf("请输入链表中元素的个数:\t");

scanf("%d",l);

head=creatlist(l);

printf("\n输入要插入元素的位置:\t");

scanf("%d",a);

if(a 1 || a l)

printf("error");

else

{

insertlist(head, a);

printf("\n插入后的新链表是:\t");

output(head);

}

printf("\n输入要删除元素的位置:\t");

scanf("%d",b);

if(b 1 || a l)

printf("error");

else

{

printf("\n删除后的新链表是:\t");

deletelist(head,b);

output(head);

}

return 0;

}

刚入c语言 有没有大佬帮我看看这咋写

#includestdio.h

#includestdlib.h

#includeconio.h

/*定义结构体*/

struct student

{

int num;

float score;

struct student *next;

};

/*创建一个只有头结点的空链表*/

struct student *create_head()

{

struct student *head;

head=(struct student*)malloc(sizeof (struct student) );

if(head==NULL) //小心别漏这个

{

printf("申请头结点失败!\n");

return NULL;

}

head-next=NULL;

return head;

}

/*将s指向的结点插入链表,使链表保持升序,并返回头结点*/

struct student *insert(struct student *head,struct student *s)

{

struct student *p=head;

while(p-next!=NULLs-scorep-next-score)//特别注意左右不能写反,若s最大,最后p-next=NULL,p-next-score运行出错

p=p-next;

if(p-next==NULL) //s-score最大的情况 //其实两种情况可以并在一块写

{

p-next=s; //连接结点

s-next=NULL; //p-next就等于NULL

}

else

{

p-next=s; //连接结点

s-next=p-next;

}

return head ;

}

/*查找符合条件的结点,并返回指向该结点的指针*/

struct student *search(struct student *head)

{

struct student *p=head-next;

int num;

printf("请输入要查找学生的学号:\n");

scanf("%d",num);

while(p!=NULLp-num!=num) //特别注意两条件不能写反,若写反最后p指向NULL时p-num找不到 运行出错

p=p-next;

if(p==NULL) //特别注意两个if不能调换,若调换最后p指向NULL时p-num运行出错

{

printf("找不到符合条件的结点!!!");

return NULL; //查找不到返回空指针

}

if(p-num==num)

{

printf("找到符合条件的结点\n该结点为%d\t%f",p-num,p-score);

return p; //返回查找到的指针

}

}

/*输出链表各结点的值,也称对链表的遍历*/

void print(struct student *head)

{

struct student *p;

printf(" 链表如下: \n");

p=head-next;

while(p!=NULL)

{

printf("%d\t%.1f\n",p-num,p-score);

p=p-next;

}

}

/*释放链表*/

void free_list(struct student *head)

{

struct student *p=head ;

printf("释放链表:\n");

while(p!=NULL)

{

head=head-next;

free(p);

p=head;

}

printf("释放链表成功!\n");

}

/*删除链表中值为num的结点,并返回链表的首指针*/

struct student *delete_note(struct student *head,int num_x)

{

struct student *p1=head-next , *p2=head ;

while(p1!=NULLp1-num!=num_x) //特别注意左右条件不能调换,若调换如果p1指向NULL时p1-num运行出错

{

p2=p1;

p1=p1-next;

}

if(p1==NULL) //特别注意两个if不能调换,若调换如果p1指向NULL时,p1-num运行出错

printf("找不到符合删除要求的结点!!!\n");

if(p1-num==num_x)

{

p2-next=p1-next;

free(p1);

printf("结点删除成功!\n");

}

return head;

}

/*完整的有头结点链表操作程序*/

void main()

{

struct student *p , *head ;

char c;

int num ;

float score ;

printf("有头结点链表操作程序:\n");

head=create_head();

while(1)

{

printf("I:插入结点(自动升序) P:输出链表 S:查找结点 D:删除结点 E:释放链表并退出程序! ");

c=getch();

switch(c)

{

case'I':

printf("请分别输入要插入学生的学号和分数:\n");

scanf("%d%f",num,score);

p=(struct student*)malloc( sizeof(struct student) );

if(p==NULL)

{

printf("申请该结点失败!!!\n");

exit (0) ;

}

p-num=num; p-score=score; //给p赋值

insert(head,p);

printf("插入成功!\n");

break;

case'P':

print(head);

break;

case'S':

search(head);

break;

case'D':

printf("请输入要删除的学生的学号:\n");

scanf("%d",num);

delete_note(head,num);

break;

case'E':

free_list(head);

exit (0);

}

}

}