【郝斌老师数据结构学习笔记 day 6】

目录

前言

一、算法

二、几种常见存储结构浅析

三、非循环单链表算法演示合集

总结 


前言

数据结构的学习笔记,记录第六天


一、算法

算法:

        狭义:算法和数据的存储方式密切相关

        广义:算法和数据的存储方式无关

                   这就是泛型思想


二、几种常见存储结构浅析

线性:连续存储【数组】

        优点:存取速度很快

        缺点:事先必须知道数组长度

                   插入删除元素很慢

                   空间通常是有限制的

                   需要大块连续的内存块

离散存储【链表】

        优点:空间没有限制

                   插入删除元素很快

        缺点:存取速度很慢

线性结构的应用   ------  栈

线性结构的应用   ------  队列

非线性:

          树

          图


三、非循环单链表算法演示合集

包含:链表的创建、遍历、求链表长,判断链表是否为空、插入元素、删除元素、排序。

(代码附详细注释)

/*
    非循环单链表几种常使用的算法演示
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h> //包含bool函数

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

//函数声明
PNODE creat_list(void);         //创建一个非循环单链表
void traverse_list(PNODE pHead);//遍历整个链表
int length_list(PNODE);         //求链表的长度
bool is_empty(PNODE pHead);     //判断链表是否为空。bool使用必须添加头文件#include <stdbool.h>
bool insert_list(PNODE,int,int);//插入元素,三个参数代表哪个链表,什么位置插入,插入的元素的值
bool delete_list(PNODE,int,int*);//删除元素,三个参数代表哪个链表,删除哪个位置的元素,可以把删除的参数放到int *这个里面去返回
void sort_list(PNODE);          //排序

int main()
{
    PNODE pHead = NULL;  //等价于 struct Node * pHead = NULL;
    int val;

    pHead = creat_list();//creat_list()函数功能是创建一个非循环单链表,并将该单链表的头结点的地址赋给pHead
    traverse_list(pHead);//traverse_list(pHead)函数功能是对链表进行遍历

//    insert_list(pHead,4,33);
    if(delete_list(pHead, 4, &val))
    {
        printf("删除成功,您删除的元素是:%d\n",val);
    }
    else
    {
        printf("删除失败,您删除的元素不存在!\n");
    }
    traverse_list(pHead);

//    int len = length_list(pHead); //length_list(pHead)函数功能是计算链表的长度输出
//    printf("链表的长度是%d\n",len);

//    sort_list(pHead);
//    traverse_list(pHead);

/*
    if(is_empty(pHead))
        printf("链表为空!\n");
    else
        printf("链表不空!\n");
*/
    return 0;
}

PNODE creat_list(void)
{
   int len;             //用来存放有效结点的个数
   int val;             //用来临时存放用户输入的结点的值
   int i;

   //分配了一个不存放有效数据的头结点
   PNODE pHead = (PNODE)malloc(sizeof(NODE));
   if(NULL == pHead)
   {
       printf("分配失败,程序终止!\n");
       exit(-1);
   }
   PNODE pTail = pHead;
   pTail->pNext = NULL;

   printf("请输入您需要生成的链表结点的个数:len = ");
   scanf("%d",&len);

   for(i=0; i<len; i++)
   {
       printf("请输入第%d个结点的值:",i+1);
       scanf("%d",&val);

       PNODE pNew = (PNODE)malloc(sizeof(NODE));
       if(NULL == pNew)
       {
          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(NULL!= p)
    {
        printf("% d",p->data);
        p = p->pNext;
    }
    printf("\n  ");
    return;
}

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

int length_list(PNODE pHead)
{
   PNODE p = pHead->pNext;
   int len = 0;

   while(NULL != p)
   {
       len++;
       p = p->pNext;
   }
   return len;
}

void sort_list(PNODE pHead)
{
    int i,j,t;

    PNODE p = NULL;
    PNODE q = NULL;
    int len = length_list(pHead);

    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;
}

//在pHead所指向链表的弟pos个结点的前面插入一个新的结点,该结点的值是val,并且pos值从1开始
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("动态内存分配失败!\n");
        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->pNext && i<pos-1)
    {
        p = p->pNext;
        i++;
    }
    if(i>pos-1 || NULL == p->pNext)
        return false;

    PNODE q = p->pNext;
    *pVal = q->data;

    //删除p结点后面的结点
    p->pNext = p->pNext->pNext;
    free(q);
    q = NULL;
    return true;
}

总结 

日进一寸,继续加油。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

稀饭豆浆和油条

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值