单链表的C语言算法实现

单链表的C语言算法实现

自己用C语言实现的单链表算法,有什么不正确的地方,请各位共同讨论与指正。

#include   
#include   
#include   
  
typedef struct Node  
{  
    int data;               //结点数据域  
    struct Node *pNext;    //指向下一结点的指针域  
}NODE, *PNODE;  
  
//创建一个链表  
PNODE create_list(void)  
{  
    PNODE pHead;    //链表头指针  
    PNODE pTail;    //链表尾指针  
    int length;     //链表有效结点个数  
    int i;  
    int val;        //每个结点的数据域  
    PNODE pNew;     //指向新创建的结点  
    printf("请输入要创建链表结点的个数:length= ");  
    scanf("%d", &length);  
  
    pHead = (PNODE)malloc(sizeof(NODE));        //创建头结点  
    if (pHead == NULL)  
    {  
        printf("内存分配失败,程序将终止!\n");  
        exit(-1);  
    }  
    pHead->pNext = NULL;  
    pTail = pHead;              //链表有效结点为零时,尾结点相当于头结点  
    for (i=0; idata = val;  
        pTail->pNext = pNew;        //使尾结点的指针域指向新创建的结点  
        pNew->pNext = NULL;         //使新创建结点的指针域指向NULL  
        pTail = pNew;               //把新创建的结点变成尾结点  
    }  
    return pHead;  
}  
  
//遍历整个链表  
void traverse_list(PNODE pHead)  
{  
    PNODE p = pHead->pNext;  
    while (p != NULL)  
    {  
        printf("%d ", p->data);  
        p = p->pNext;  
    }  
    printf("\n");  
    return;  
}  
  
//判断链表是否为空  
int is_empty(PNODE pHead)  
{  
    if (pHead->pNext == NULL)  
    {  
        return 0;  
    }  
    else  
    {  
        return -1;  
    }  
}  
  
//求链表的长度  
int length_list(PNODE pHead)  
{  
    int length = 0;  
    PNODE p = pHead->pNext;  
    while (p != NULL)  
    {  
        length++;  
        p = p->pNext;  
    }  
    return length;  
}  
  
//排序  
void sort_list(PNODE pHead)  
{  
    int i, j, t, len = length_list(pHead);  
    PNODE p, q;  
    p = pHead;  
    for (i=0; ipNext;  
        q = p->pNext;  
        for (j=i+1; jdata > q->data)  
            {  
                t = p->data;  
                p->data = q->data;  
                q->data = t;  
            }  
            q = q->pNext;  
        }  
    }  
}  
  
//在第pos个结点之前插入一个结点val  
int insert_list(PNODE pHead, int pos, int val)  
{  
    PNODE p = pHead;  
    int i=0;  
    while (p != NULL && i < pos - 1)  
    {  
        p = p->pNext;  
        i++;            //找到第i个结点  
    }  
    if (p == NULL || i > pos - 1)  
    {  
        return -1;  
    }  
  
    PNODE pNew = (PNODE)malloc(sizeof(NODE));  
    if (pNew == NULL)  
    {  
        printf("内存分配失败,程序将终止!\n");  
        exit(-1);  
    }  
    pNew->data = val;  
    pNew->pNext = p->pNext;  
    p->pNext = pNew;  
    return 0;  
}  
  
//删除第pos个结点  
int delete_list(PNODE pHead, int pos, int *pVal)  
{  
    PNODE p = pHead;  
    int i=0;  
    //找到待删结点的前一个结点  
    while (p->pNext != NULL && i < pos - 1)  
    {  
        p = p->pNext;  
        i++;  
    }  
    if (p->pNext == NULL || i > pos - 1)  
    {  
        return -1;  
    }  
    *pVal = p->pNext->data;  
    PNODE q = p->pNext;  
    p->pNext = p->pNext->pNext;  
    free(q);  
    return 0;  
}  
  
int main()  
{  
    int val;  
    PNODE pHead = create_list();  
    traverse_list(pHead);  
    if (delete_list(pHead, 3, &val) == 0)  
    {  
        printf("删除成功,您删除的元素是:%d\n", val);  
    }  
    else  
    {  
        printf("删除失败\n");  
    }  
    traverse_list(pHead);  
    return 0;  
}  

你可能感兴趣的:(单链表的C语言算法实现)