#include<stdio.h>
#include<stdlib.h>
typedef struct LNode //单链表数据结构
{
int data ;
struct LNode *next;
}LNode,*LinkList;
//int N=0; //表长记数,全局变量
LinkList createlist(); // 创建链表算法
int charu(LinkList L); //插入算法
int printout(LinkList L); //显示链表内容算法
int main()
{
int a;
LinkList L;
L=createlist(); //建表
printf("原表数据:\n");
printout(L);
charu(L); //插入
printout(L); //输出插入后的结果
return 0;
}
LinkList createlist() //尾插入法初始化按值递减链表
{
int a,j;
LNode *s;
LinkList L=(LinkList)malloc(sizeof(LNode)); //带头节点的空链表
s=L;
for(j=20;j>=-10;j=j-2)
{
s->next=(LinkList)malloc(sizeof(LNode)); //生成新节点
s=s->next;
s->data=j;
// N++;
}
s->next=NULL;
return L;
}
int charu(LinkList L)
{
int a;
printf("输入要插入的数:");
scanf("%d",&a);
LinkList p,s,q; //p是插入位置定位指针,q是p的前一个结点指针
p=L->next; q=L; //p指向开始结点,q指向头结点
while(p&&p->data>a) //从前向后遍历递减序列,在第一个小于a的位置上插入
{
p=p->next; q=q->next; //大于a时,则移动p和q指针,q是p的前驱结点
}
if(q->next==p)
{
s=(LinkList)malloc(sizeof(LNode)); //创建新结点s,保存a
s->data=a;
s->next=p; q->next=s; //插入到q之后,p之前
}
else printf("数据插入出错\n");
}
int printout(LinkList L)
{
LNode *m=L->next; //m是定位指针
while(m!=NULL)
{
printf("%4d",m->data);
m=m->next;
}
printf("\n");
}