首页 > 其他 > 详细

数据结构 链表笔记

时间:2017-04-16 13:31:11      阅读:184      评论:0      收藏:0      [点我收藏+]
/*
    数据结构 链表的实现即操作 
*/

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

// 单向链表
typedef struct list
{
    int data;  // 链表数据域
    struct list * pNext; 
}None, * pNone;

// 链表的创建 
pNone Create_List();
// 链表的遍历 
void Travel_List(pNone);
// 判断链表是否为空
bool Is_Empty(pNone); 
// 计算链表长度
int Length_List(pNone);
// 链表节点的插入, 形参为链表头地址 在哪个位置前插入 插入的节点的值 
void Insert_List(pNone, int, int);
// 链表节点的删除,形参为链表头地址,需要删除的节点的位置
void Delete_List(pNone, int);
// 链表的排序
void Seq_List(pNone); 
// 链表的销毁
void Destroy_List(pNone); 

int main(void)
{
    pNone pHead = Create_List();
    Travel_List(pHead);
    
    int pos, val;
    printf("请输入需要插入的位置及该的数据!\n");
    scanf("%d %d", &pos, &val);
    Insert_List(pHead, pos, val);
    Travel_List(pHead);
    
    printf("请输入需要删除的位置!\n");
    scanf("%d %d", &pos);
    Delete_List(pHead, pos);
    Travel_List(pHead);
    
    Destroy_List(pHead);
    
    return 0;
}

pNone Create_List(void)
{
    int len;
    printf("请输入您需要的链表长度:");
    scanf("%d", &len);
    pNone pHead = (pNone)malloc(sizeof(None));
    if (NULL == pHead)
    {
        printf("动态内存分配失败!\n");
        exit(-1);
    }
    pHead->pNext = NULL;
    pNone pNew, pTemp;
    pNew = pHead;
    for (int i = 0; i < len; ++i)
    {
        pTemp = (pNone)malloc(sizeof(None));
        if (NULL == pTemp)
        {
            printf("动态内存分配失败!\n");
            exit(-1);
        }
        pTemp->pNext = NULL;
        pNew->pNext = pTemp;
        printf("请输入此节点储存的数据:");
        scanf("%d", &pTemp->data);
        printf("\n"); 
        pNew = pNew->pNext;
    }
    
    return pHead; 
}

void Travel_List(pNone pHead)
{
    pNone pTemp;
    while (pHead->pNext != NULL)
    {
        pTemp = pHead->pNext;
        printf("%-5d\n", pTemp->data);
        pHead = pHead->pNext;
    }
    
    return;
}

bool Is_Empty(pNone pHead)
{
    if (NULL == pHead->pNext)
        return true;
    else
        return false;
}

int Length_List(pNone pHead)
{
    int cnt = 0;  // 记录链表长度
    while (NULL != pHead->pNext)
    {
        ++cnt;
        pHead = pHead->pNext;
    }
    
    return cnt;
}

void Insert_List(pNone pHead, int pos, int val)
{
    // 首先要判定被插入的位置是否存在
    pNone pTemp = pHead;
    int i = 0;
    // 说明:此循环结束后pTemp记录的是第pos-1个节点的地址 
    while (NULL != pTemp && i < pos-1)
    {
        pTemp = pTemp->pNext;
        ++i;
    } 
    if (NULL == pTemp || i > pos-1)
    {
        printf("插入失败!\n");
        exit(-1); 
    }
    pNone pNew;
    pNew = (pNone)malloc(sizeof(None));
    if (NULL == pNew)
    {
        printf("动态内存分配失败!\n");
        exit(-1);
    }
    pNew->data = val;
    pNew->pNext = pTemp->pNext;
    pTemp->pNext = pNew;
    
    return;
}

void Delete_List(pNone pHead, int pos)
{
    pNone pTemp = pHead;
    int i = 0;
    while (NULL != pTemp && i < pos-1)
    {
        pTemp = pTemp->pNext;
        ++i;
    }
    if (NULL == pTemp || i > pos-1)
    {
        printf("删除失败!\n");
        exit(-1);
    }
    pNone pTemp1 = pTemp->pNext;
    int val = pTemp1->data;
    pTemp->pNext = pTemp1->pNext; 
    printf("被删除的节点数据为:%d\n", val); 
    
    return;
}

void Seq_List(pNone pHead)
{
    pNone pTemp, pTemp1, pTemp2, pTemp3, pMax, pMax1, pMax2;
    pTemp = pHead;  // 表示要开始用来比较的原节点的前一个节点地址 
    pTemp1 = pTemp->pNext;  // 表示开始用来比较的原节点的地址 
    while (NULL != pTemp1->pNext)
    {
        pMax1 = pTemp;  // 追踪最大值前面的节点  
        pMax = pTemp1;  // 用来追踪最大值的节点 
        pTemp2 = pMax;  // 用于追踪被比较点前一个点的地址 
        pTemp3 = pMax->pNext;  // 用于追踪被比较点 
        while (NULL != pTemp2->pNext)
        {
            if (pMax->amount < pTemp3->amount)
            {
                pMax1 = pTemp2; 
                pMax = pTemp3;
            }
            pTemp2 = pTemp2->pNext;
            if (NULL != pTemp2->pNext)
                pTemp3 = pTemp2->pNext;
        }
        pMax1->pNext = pMax->pNext; 
        pMax->pNext = pTemp1;
        pTemp->pNext = pMax;
        pTemp = pMax;
        pTemp1 = pTemp->pNext;        
    }
    
    return;
}

void Destroy_List(pNone pHead)
{
    pNone pTemp;
    while (pHead != NULL)
    {
        pTemp = pHead->pNext;
        free(pHead);
        pHead = pTemp;    
    }
    
    return;
}

 

数据结构 链表笔记

原文:http://www.cnblogs.com/lnlin/p/6718339.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!