/*需求:
创建一个链表,添加3个节点,实现节点的排序,分别将链表正向与反向输出。*/
#include
#include
#include
/*链表*/
typedef struct TLink {
int data;/*数据*/
struct TLink * next;/*指向下一个节点的指针*/
} L;
/*在链表中插入一个节点,并保持链表有序
为方便使用,采用二级指针而不是返回值来控制表头*/
void insert(L ** head, int data)
{
L * n = 0, * m = 0, * p = 0;
if(!head) return ;/*不允许二级指针为空*/
n = (L *)malloc(sizeof(L));/*创建节点*/
memset(n, 0, sizeof(L));/*将节点内容清零*/
n->data = data;/*存储数据*/
m = *head;/*取得表头*/
if(!m) { *head = n; return ; }/*如果为空表则用新节点作为表头*/
/*在链表有序前提下,如果新节点数据比表头数据还小,则新节点当作为表头*/
if(data < m->data) { n->next = m; *head = n; return ;}
/*选择合适位置插入新节点*/
while(m->next ) {
p = m->next ;
if(data > p->data) { m = p; continue; }
n->next = p; m->next = n;
return ;
}
m->next = n;/*如无合适位置则在表尾插入*/
}
/*输出链表,head为表头,inverse=0表示正向输出,1表示反向输出*/
void print(L * head, int inverse)
{
L * n = 0;
if(!head) return ;/*不允许打印空表*/
if(inverse) {/*如果要求反向输出,则用递归方法逆序打印*/
print(head->next , inverse);
printf("%d ", head->data);
return ;
}
n = head;/*如果要求正向输出,则不需要递归,采用循环打印*/
while(n) {
printf("%d ", n->data);
n = n->next ;
}
}
int main(void)
{
L * h = 0; int i = 0, n = 0;
printf("请输入三个整数用于创建一个具有三个节点的链表。\n");
for(i = 1; i < 4; i++) {
printf("第%d个整数:", i);
scanf("%d", &n); insert(&h, n);
}
printf("\n排序已完成\n链表正向打印:"); print(h, 0);
printf("\n链表逆向打印:"); print(h, 1);
printf("\n程序结束。");
system("pause");/*输出“请按任意键继续”*/
return 0;
}
/*程序运行结果示例:
请输入三个整数用于创建一个具有三个节点的链表。
第1个整数:88
第2个整数:35
第3个整数:97
排序已完成
链表正向打印:35 88 97
链表逆向打印:97 88 35
程序结束。请按任意键继续. . .
*/