首先,主函数中,“请输入插入的数据”那里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
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)