各位大佬,求教。
单链表中值为y的结点前面插入一个值为x的结点,即使值为x的新结点成为值为y的结点的前驱结点。
以下是代码,不知道为什么creatlistr建表函数没有修改head单链表,return head也一样。
#include <stdio.h>
#include <stdlib.h>
/************************************/
/* 链表实现的头文件,文件名slnklist.h */
/************************************/
typedef int datatype;
typedef struct link_node{
datatype info;
struct link_node *next;
}node;
/*****************************************************/
/* 函数功能:建立一个空的单链表 */
/* 函数参数:无 */
/* 函数返回值:指向node类型变量的指针 */
/* 文件名:slnklist.c,函数名:init() */
/******************************************************/
node *init()
{
return NULL;
}
/****************************************************/
/* 函数功能:输出单链表中各个结点的值 */
/* 函数参数:指向node类型变量的指针head */
/* 函数返回值:空 */
/* 文件名slnklist.c,函数名display() */
/*****************************************************/
void display(node *head)
{
node *p;
p=head;
if(!p) printf("单链表是空的!\n");
else
{
printf("单链表各个结点的值为:");
while(p) { printf("%5d",p->info);p=p->next;}
}
}
//队列方式建立单链表(尾插法)
node *creatlistr(node *head)
{
node *s,*r=NULL;
datatype data;
printf("请输入各结点值(以0结束):");
scanf("%d",&data);
while (data)
{
s=(node *)malloc(sizeof(node));
s->info=data; /*产生新结点*/
if (head==NULL)
head=s; /*新结点插入空表*/
else
r->next=s;
r=s;
scanf("%d",&data);
} /*处理表尾结点指针域*/
if(r!=NULL)
r->next=NULL;
return head;
}
//函数功能:在结点值为y的结点前插入一个值为x的结点
node *preinsert(node *head,datatype y,datatype x)
{
node *p,*q=head;
node *pre=NULL;
while(q&&q->info!=y) //没有找到并且没有找完
{
pre=q;
q=q->next;
} //pre指向p的前驱结点
if(!q)
printf("找不到此结点!");
else
{
p=(node*)malloc(sizeof(node));/*分配空间*/
p->info=x;/*设置新结点*/
if(!pre) //要插入的是第一个结点
{
p->next=head; /*插入(1)*/
head=p; /*插入(2)*/
}
else
{
p->next=pre->next;/*插入(1)*/
pre->next=p;/*插入(2)*/
}
}
return head;
}
void main()
{
node *head=init();
datatype x,y; //插入值
creatlistr(head);
display(head);
printf("请输入要在值为?的结点前插入结点?: ");
scanf("%d%d",&y,&x);
display(preinsert(head,y,x));
}