编辑代码

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <stdbool.h>

//构建typedef
typedef struct Node
{
    int data;// 数据域
    struct Node*pNext; //指针域
}NODE,*PNODE; //NODE 等价于 struct Node , PNODE 等价于 struct Node * ;

//函数声明区域
PNODE create_list(void);
void traverse_list(PNODE);
bool is_empty(PNODE);
int length_list(PNODE);
bool sort_list(PNODE);
bool insert_list(PNODE,int,int);
bool delete_list(PNODE,int,int*);

//主函数运行区域
int main (void) 
{
    int val; //存放删除的节点数据
    PNODE pHead = NULL; //等价于 struct Node * pHead = NULL
    pHead = create_list(); //创建一个非循环单链表 并且把该链表的头结点的地址附给pHead

/*    if(is_empty(pHead))  //链表是否为空
        printf("链表为空\n");
    else
        printf("链表不空\n");
*/

    traverse_list(pHead);
    sort_list(pHead);
    traverse_list(pHead);
    return 0;
} 


//构建函数区域
PNODE create_list(void)
{
    int len;
    int val;
    PNODE pHead =  (PNODE)malloc (sizeof(NODE));
    if(NULL == pHead)
    {
        printf("内存分配失败!\n");
        exit(-1);
    }

    PNODE pTail = pHead;//新建一个节点 始终指向尾节点 。现在只有一个节点 所以头结点就是最后一个节点
    pTail ->pNext = NULL;
    printf("请输入需要生成的节点: len= \n");
    scanf("%d",&len);
    for(int i=0 ; i < len ; ++i)
    {
        printf("请输入第 %d 个节点的值",i+1);
        scanf("%d",&val);
        PNODE pNew =  (PNODE)malloc (sizeof(NODE));
        if(NULL == pHead)
        {
            printf("内存分配失败!\n");
            exit(-1);
        }
        pNew->data = val;
        pTail->pNext = pNew;
        pNew->pNext=NULL;
        pTail = pNew;

    }
    return pHead;
}

//遍历输出链表
void  traverse_list(PNODE pHead)
{
    PNODE p = pHead->pNext;
    while(p != NULL)
    {
        printf("%d\n",p->data);
        p=p->pNext;
    }
    printf("\n");
    return;
}

//判断链表是否为空
bool is_empty(PNODE pHead)
{
    if(NULL == pHead)
    return true;
    else
    return false;
}

//求链表长度
int length_list(PNODE pHead)
{
    int len=0;
    PNODE p = pHead->pNext;
    while(p != NULL)
    {
        len++;
        p=p->pNext;
    }
    return len;
}

//参考数组的排序;
    bool sort_list(PNODE pHead)
    {
        int i,j,t;
        int len=length_list(pHead);
        PNODE p,q;
        for(i=0,p=pHead->pNext;i<len-1;++i,p=p->pNext)
        {
            for(j=i+1,q=p->pNext;j<len;++j,q=q->pNext)
            {
                if(p->data > q->data)
                {
                    t = p->data;
                    p->data = q->data;
                    q->data = t;
                }
            }
        }
        return true;
    }

//链表中插入一个节点
bool insert_list(PNODE pHead,int  pos,int val)
{
    int i=0;
    PNODE p = pHead;

    while(NULL != p && i<pos-1)
    {
        p=p->pNext;
        ++i;
    }
    if(i > pos-1 || NULL == p)
    return false;
    PNODE pNew = (PNODE)malloc(sizeof(NODE));
    if(NULL == pNew)
    {
        printf("内存分配失败");
        exit(-1);
    }
    pNew->data = val;
    PNODE q = p->pNext;
    p->pNext = pNew;
    pNew->pNext = q;
    return true;
}

//删除一个节点
bool delete_list(PNODE pHead,int pos,int* pVal)
{
    int i=0;
    PNODE p = pHead;

    while(NULL != p && i<pos-1)
    {
        p=p->pNext;
        ++i;
    }
    if(i>pos-1||NULL==p->pNext)
    return false;
    PNODE q=p->pNext;
    *pVal = q->data;
    p->pNext = p->pNext->pNext;
    free(q);
    q = NULL;
    return true;
}