编写程序,建立两个带头结占单链表,给入若干敷数,将正整数插人第1个单链表,将负整数插人第2个单链表,插入前和插入后单链表保持递增或相等次序,显示两个单链表,最后销毁。程序不可存在内存泄漏。
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
struct Node
{
int data;
struct Node *next;
};
//将元素插入有序单链表中,插入后仍然有序
void Insert (struct Node *la, int x);
//销毁单链表
void Destory (struct Node *la);
//打印单链表
void Print (struct Node *la);
//动态分配一个结点,返回结点指针
//分配失败时,简化程序,退出运行
struct Node *NewNode ()
{
struct Node *p;
p = (struct Node *) malloc (sizeof (struct Node));
if (p == NULL) { //分配失败
printf ("Error : out of memory\n");
exit (-1); //简化程序,退出运行
}
return p;
}
int main ()
{
struct Node *la1 = NewNode ();
la1->next = NULL;
struct Node *la2 = NewNode ();
la2->next = NULL;
int x;
while (scanf ("%d", &x) != EOF)
{
if (x > 0)
Insert (la1, x);
else
Insert (la2, x);
}
Print (la1);
Print (la2);
Destory (la1);
Destory (la2);
return 0;
}
//将元素插入有序单链表中,插入后仍然有序
void Insert (struct Node *la, int x)
{
//申请结点
struct Node *q= NewNode ();
q->data = x;
//查找合适插入位置
struct Node *p = la;
while (p->next && x > p->next ->data)
p = p->next; //往后移一位置
//将结点插入p所指结点后
q->next = p ->next ;
p->next = q;
}
//销毁单链表
void Destory (struct Node *la)
{
while (la)
{
struct Node *q = la->next;
free (la); //释放指针所指结点
la = q;
}
}
//打印单链表
void Print (struct Node *la)
{
//头结点无数据
la = la ->next;
if (la) //数据比-〉多一个
{
printf ("%d", la->data);
la = la->next;
}
while (la)
{
printf ("->%d", la->data);
la = la->next;
}
printf ("\n");
}