本文目录一览:
- 1、请帮我解决在c语言链表中代码:return head; 有什么作用!
- 2、c语言链表插入一个新节点的函数问题
- 3、C语言链表问题
- 4、c语言程序设计 实现一个链表的插入,删除,输出 结果这个代码输出时老是出错,求帮忙
- 5、刚入c语言 有没有大佬帮我看看这咋写
请帮我解决在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);
}
}
}