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

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

首先,主函数中,“请输入插入的数据”那里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)

}

加分了

#include<stdio.h>

#include<stdlib.h>

class point //节点类

{

public:

int a //节点值

point *next//next指针

}

void newlast(point *&p,int i) //在*p所指的链表的最后新建一个值为i的节点

{

point *q,*o

q=p

while(q->next)

{

q=q->next

}

printf("%d\n",q->a)

o=(point *)malloc(sizeof(point))

o->a=i

q->next=o

o->next=NULL //结束标记

}

void show(point *p)//输出指针p所指链表

{

point *q

q=p

while(q)

{

printf("%d\t",q->a)

q=q->next

}

printf("\n")

}

int main()

{

point b1,b2,b3

point *p

b1.a=1

b2.a=2

b3.a=3

p=&b1

b1.next=&b2

b2.next=&b3

b3.next=NULL //结束标记

show(p)

newlast(p,4)

show(p)

return 0

}

如果已知一个节点指针pre和一个节点指针cur,要把cur插入到pre节点之后,很显然要保证链表不会断开而丢失后面的节点,要先把后面的节点指针(指向lat的指针)保存下来,即有cur->next

=

pre->next,然后把cur连接的一串链表连接到pre后面,即pre->next

=

cur

上面介绍了,在一个节点之后插入节点的情况。这是通常的情况。如果要向一个链表的头部插入节点,就只需要将新节点的下一个指针指向链表的头指针即可。

在这种情况下,有两点要注意:

1,链表是否为空链表

2,要插入的节点是不是空指针。

代码实现:

//向单链表中插入一个节点(插入在链开始处)

//输入参数:单链表的头指针和要插入的节点指针

//输出参数:无

//返回值:指向单链表的头指针

singlelist*

insert(singlelist

*head,singlelist

*node)

{

if(node

==

null)

{

return

head

}

else

if(head

==

null)

{

return

node

}

node->next

=

head

head

=

node

return

head

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11932235.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存