11-数据结构_链表相关操作

// 动态创建非循环单链表, 并返回头指针
PNODE createList(void);
// 遍历链表
void traverseList(PNODE pHead);
// 是否为空
bool isEmpty(PNODE pHead);
// 链表长度
int listSize(PNODE pHead);
// 插入一个元素, pos-位置(首结点为索引为1), value-插入结点的值 
bool insert(PNODE pHead, int pos, int value);
// 删除一个元素, pValue-删除节点的数据域
bool delete(PNODE pHead, int pos, int * pValue);
// 排序, 冒泡 升序, 
void sort(PNODE pHead);
// 排序, 快排 降序, 

void sort_2(PNODE pHead);


完整程序 

05-node.c

#include <stdio.h>  // print / scanf
#include <malloc.h> // malloc
#include <stdlib.h> // exit
#include <stdbool.h>// bool

typedef struct Node
{
    int data;   // 数据域
    struct Node * pNext; // 指针域
} NODE, * PNODE; 
// NODE <==> struct Node, PNODE<==>struct Node *

// 动态创建非循环单链表, 并返回头指针
PNODE createList(void);
// 遍历链表
void traverseList(PNODE pHead);
// 是否为空
bool isEmpty(PNODE pHead);
// 链表长度
int listSize(PNODE pHead);
// 插入一个元素, pos-位置(首结点为索引为1), value-插入结点的值 
bool insert(PNODE pHead, int pos, int value);
// 删除一个元素, pValue-删除节点的数据域
bool delete(PNODE pHead, int pos, int * pValue);
// 排序, 冒泡 升序, 
void sort(PNODE pHead);
// 排序, 快排 降序, 
void sort_2(PNODE pHead);

int main(void)
{
    PNODE pHead = NULL; // <==> struct Node * pHead;

    // 创建一个非循环单链表
    pHead = createList();
    
    // 是否为空链表
    if (isEmpty(pHead))
    {
        printf("链表为空? YES\n");
    }
    else 
    {
        printf("链表为空? NO\n");
    }
    

    // 链表的长度
    printf("链表的长度? %d\n", listSize(pHead));

    // 遍历链表
    traverseList(pHead);     
    
    // 插入
/*
    int pos, value;
    printf("请输入插入的位置和值\n");
    printf("pos = ");
    scanf("%d", &pos);
    printf("value = ");
    scanf("%d", &value);

    insert(pHead, pos, value);
    traverseList(pHead);
*/
    // 删除
/**/
    int pos, value;
    printf("请输入删除结点的位置\n");
    printf("pos = ");
    scanf("%d", &pos);

    delete(pHead, pos, &value);
    printf("删除结点的值 value = %d\n", value);

    traverseList(pHead);


    // 排序- 升序
    sort(pHead);

    // 排序- 降序
    sort_2(pHead);

    traverseList(pHead);

    return 0;
}

PNODE createList(void)
{
    int length; // 链表长度, 即结点个数
    printf("结点个数 length = ");
    scanf("%d", &length);

    // 头指针.
    PNODE pHead = (PNODE) malloc( sizeof(NODE) );
    if ( NULL == pHead)
    {
        printf("动态内存分配失败!!");
        exit(-1);
    }    

    // 尾指针
    PNODE pTail = pHead;
    pTail->pNext = NULL;

    // 给结点赋值
    int i;
    int value;  // 数据域 临时变量
    for (i = 0; i < length; ++i)
    {
        printf("请输入第 %2d 个结点的值: ", i+1);
        scanf("%d", &value);

        PNODE pNewNode = (PNODE) malloc(sizeof(NODE));  // 新结点分配内存
        pNewNode->data = value; // 给新结点赋值
        // 将新结点 挂到末尾
        pTail->pNext = pNewNode;    
        pNewNode->pNext = NULL; // 尾结点 指针域为空

        pTail = pNewNode;   // 新添加的结点 作为 尾结点.

    }

    return pHead;
}

void traverseList(PNODE pHead)
{   
    PNODE pNode = pHead->pNext; // 指向首结点
    printf("遍历: ");
    while (NULL != pNode)
    {
        printf("%3d", pNode->data);
        pNode = pNode->pNext;   // 移向下一个结点
    }

    printf("\n");
    return;
}

bool isEmpty(PNODE pHead)
{
    if ( NULL == pHead || NULL == pHead->pNext)
    {
        return true;
    }
    return false;
}

int listSize(PNODE pHead)
{
    int count = 0;  // 计数器,

    PNODE pNode = pHead->pNext; // 指向首结点

    while (NULL != pNode)
    {
        ++count;
        pNode = pNode->pNext;
    }
    
    return count;
}

bool insert(PNODE pHead, int pos, int value)
{
    if (pos < 1 || pos > listSize(pHead))
    {
        printf("非法位置, 0 < pos < %d \n", listSize(pHead)+1);
        return false;
    }
    
    // 定位到指定位置结点 的 前一个节点
    PNODE pNode = pHead; // 指向头结点, 索引为0
    int count = 0;
    while (count < pos - 1)
    {
        pNode = pNode->pNext;
        ++count;
    }

    // 新建结点
    PNODE pNew = (PNODE) malloc( sizeof(NODE) );
    pNew->data = value;

    // 插入
    pNew->pNext = pNode->pNext;
    pNode->pNext = pNew;

    return true;
}

bool delete(PNODE pHead, int pos, int * pValue)
{
    if (pos < 1 || pos > listSize(pHead))
    {
        printf("非法位置, 0 < pos < %d \n", listSize(pHead)+1);
        return false;
    }

    int count = 0; // 计算器
    PNODE pNode = pHead; // 指向头结点

    // 定位到 指定位置结点 的前一个结点
    for (; count < pos - 1; ++count)
    {
        pNode = pNode->pNext;
    }

    // 删除 该结点
    PNODE pTemp = pNode->pNext; // pTemp指向的结点为要删除的节点
    pNode->pNext = pTemp->pNext;

    // 返回 删除的结点的值
    *pValue = pTemp->data;

    // 释放内存
    free(pTemp); 

    return true;
}

void sort(PNODE pHead)
{
    int i, j;
    int length = listSize(pHead);
    int temp;
    PNODE pNode = NULL;

    for (i = 0; i < length - 1; ++i)
    {
        pNode = pHead->pNext;   // 指向首结点
        for (j = 0; j < length - 1 - i; ++j)
        {
            if (pNode->data > pNode->pNext->data)
            {
                temp = pNode->data;
                pNode->data = pNode->pNext->data;
                pNode->pNext->data = temp;
            }
            pNode = pNode->pNext;   
        }
    }

    return;
}

void sort_2(PNODE pHead)
{
    int i, j;
    int length = listSize(pHead);
    int temp;
    PNODE pLeft, pRight;

    pLeft = pHead;

    for (i =0; i < length -1; ++i)
    {
        pLeft = pLeft->pNext;
        pRight = pLeft->pNext;

        for (j = i + 1; j < length; ++j)
        {
            if (pLeft->data < pRight->data)
            {
                temp = pLeft->data;
                pLeft->data = pRight->data;
                pRight->data =temp;
            }
            pRight = pRight->pNext;
        }
    }

    return;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值