链表表存储与操作实现

根据以下要求设计实验:
编写函数
void CreateList( )
实现功能:对链表HL1中的元素按照偶数从大到小,奇数从小到大的顺序,分别复制创建链表HL2和HL3。
(注:禁止采用InsertList和SortList 函数)
(1)定义数组:a[]=(27,6 15 18 8 12 35 23 21 38]
(2)利用InsertList()按数组中元素原顺序创建链表HL1,并遍历HL1。
I(3)调用CreateList( )函数,得到链表 HL2 和 HL3。
(4)分别遍历HL2和HL3。


#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct node {
    int data;
    struct node* next;
}node, * ptrnode;

void initlist(ptrnode& L) //初始化,申请头节点
{
    L = (ptrnode)malloc(sizeof(node));
    if (!L) exit(0); //内存分配不成功退出程序
    L->next = NULL;
}
//创建链表L1,将原数组中的所有元素都放入L1中
void createList(ElemType* num, ptrnode& L)
{
    int i;
    ptrnode p, q;
    p = L;
    for (i = 0; i < 10; i++)
    {
        q = (ptrnode)malloc(sizeof(node));
        if (!q) exit(0);
        q->data = num[i];
        q->next = NULL;
        p->next = q;
        p = q;
    }
}
//链表的节点插入函数
void insertlist(ptrnode& L, ElemType data)
{
    ptrnode p, r;
    r = L;
    p = (ptrnode)malloc(sizeof(node));
    if (!p) exit(0);
    p->data = data;
    p->next = NULL;
    while (r->next != NULL) r = r->next;
    r->next = p;
}
//遍历L1的同时判断L1->data是否为偶数,将偶数插入L2,将奇数插入L3
void givelist(ptrnode& L2, ptrnode& L3, ptrnode L1)
{
    ptrnode p;
    p = L1->next;
    while (p)
    {
        if (p->data % 2 == 0)
        {
            insertlist(L2, p->data);
        }
        else {
            insertlist(L3, p->data);
        }
        p = p->next;
    }
}
//遍历输出函数
void traverselist(ptrnode L)
{
    ptrnode p;
    p = L->next;
    while (p)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}
int main(void)
{
    ElemType num[10] = { 27,6,15,18,8,12,35,23,21,38 }; //原数组
    int i;
    ptrnode L1, L2, L3; //声明变量
    //调用函数操作
    initlist(L1);
    initlist(L2);
    initlist(L3);
    createList(num, L1);
    givelist(L2, L3, L1);
    traverselist(L1);
    traverselist(L2);
    traverselist(L3);
    return 0;
}

使用链表的操作,望采纳!