数据结构___链表的操作

概要

因为操作的需要现在重新学习了数据结构相关知识,故以此文来总结一下链表的基本操作和基本知识

声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出

数据结构(抽象到具体)

  • 提供类型属性和相关操作的抽象描述。这种抽象的描述被称为抽象数据结构即ADT(Abstract Data Type)
  • 开发一个实现ADT的编程接口(指明数据如何存储和执行的函数)
  • 编写代码的实现接口

具体流程

1.建立抽象

  • 初始化一个空链表
  • 在链表末尾添加一个新项
  • 确定链表是否为空
  • 确定链表是否为满
  • 确定链表中的项数
  • 在链表任意位置插入一个项
  • 移除链表中的一个项
  • 在链表中检索一个项(不改变链表)
  • 用另一个项替换链表中的一个项
  • 清空链表

2.建立接口

//存储的基本类型
typedef struct film{
	char title[64];		//存储的电影标题
	float rating;			//存储的评分
}Item;

typedef struct node{
	Item item;
	struct node *next;
}Node;

typedef Node *list;
//在链表的实现中,每一个链节叫做节点(node),每一个节点包含形成链表内容的信息和指向下一个节点的指针。
/*  操作:把树初始化为空
    前提条件:ptree指向一个树
    后置条件:树被初始化为空
*/
void InitTree(Tree *ptree);

/*  操作:判断树是否为空
    前提条件:ptree指向一个树
    后置条件:树为空返回true,否则返回false
*/
bool TreeIsEmpty(const Tree *ptree);

/*  操作:判断树是否为满
    前提条件:ptree指向一个树
    后置条件:树为满返回true,否则返回false
*/
bool TreeIsFull(const Tree *ptree);

/*  操作:确定树的项数
    前提条件:ptree指向一个树
    后置条件:返回树的项数
*/
int TreeItemCount(const Tree *ptree);

/*  操作:在树中添加一个项
    前提条件:pi是待添加项的地址
    后置条件:如果可以添加该函数将在树中添加一个项,返回true
            否者返回false
*/
bool AddItem(const Item *pi,Tree *ptree);

/*  操作:在树中查找一个项
    前提条件:pi是待添加项的地址,ptree指向一个已初始化的树
    后置条件:如果可以添加该函数将在树中添加一个项,返回true
            否者返回false
*/
bool InTree(const Item *pi,Tree *ptree);

/*  操作:在树中删除一个项
    前提条件:pi是删除项的地址,ptree指向一个已初始化的树
    后置条件:如果可以成功删除一个项,返回true
            否者返回false
*/
bool DeleteTree(const Item *pi,Tree *ptree);

/* 操作:   把函数应用于树中的每一项      
 前提条件:  ptree指向一个树           
        pfun指向一个函数,       
        该函数接受一个Item类型的参数,并无返回值
 后置条件:  pfun指向的这个函数为树中的每一项执行一次*/

void Traverse(const Tree *ptree,void(*pfun)(Item item));

/*  操作:删除书中所有内容
    前提条件:pi是删除项的地址,ptree指向一个已初始化的树
    后置条件:树为空
*/
void DeleteAll(Tree *ptree);

3.使用接口
这一部分是通过代码来将伪代码的功能进行实现

//链表设置为空
void InitializeList(List *plist){
    plist = NULL;
}
//判断链表是否为空
bool ListIsEmpty(const List *plist){
    if(*plist == NULL)
        return true;
    else    
        return false;
}
//如果链表已满,返回true
bool ListIsFull(const List * plist){
    Node *pt;
    bool full;
    pt =(Node *)malloc(sizeof(Node));
    if(pt == NULL)
    full = true;
    else
    full = false;
    free(pt);
    return full;
}

//返回节点数量
unsigned int ListItemCount(const List *plist){
    unsigned int count = 0;
    Node *pnode = *plist;       //设置链表的开始
    while(pnode != NULL){
        ++count;
        pnode = pnode->next;    //设置下一个节点
    }
    return count;
}

//创建储存项的节点,并将其添加至由Plist指向的链表末尾
bool AddItem(Item item,List *plist){
    Node *pnew;
    Node *scan=*plist;
    pnew=(Node *)malloc(sizeof(Node));
    if(pnew==NULL){
        return false;
    }
    CopyToNode(item,pnew);
    pnew->next = NUUL;
    if(scan == NULL)        //空链表所以把pnew放在表头
    *plist = pnew;
    else
    {
        while(scan->next != NULL)
        scan= scan->next; /* 找到链表的末尾 */
        scan->next = pnew;/* 把pnew添加到链表的末尾 */
    }
    return true;
}

//访问每个节点并执行pfun指向的函数
void Traverse(const List *list ,void(*pfun)(Item item)){
    Node *pnode = *plist;       //设置链表的开始
    while(pnode != NULL)
    {
        (*pfun)(pnode->item);   //把函数应用链表中的项
        pnode = pnode->next;    //前进到下一项
    } 
}

 //释放由malloc分配的内存
 //设置链表的指针为NULL
 void EmptyTheList(List *plist){
     Node *psave;
     while(*plist != NULL){
         psave =(*plist)->next;     //保存下一个节点的地址
         free(*plist);              //释放当前节点
         *plist = psave;            //前进至下一个节点
     }
 }

/* 局部函数定义 */
/* 把一个项拷贝到节点中 */
static void CopyToNode(Item item, Node * pnode)
{
pnode->item = item; /* 拷贝结构 */
}

结果图
在这里插入图片描述

此案例:是通过链表来实现一个电影的名称和排名的信息保存功能

而塞过 2021-1-11

关于我:一个就要进入互联网,经历社会毒打的99小伙

下一站(javascript)
下一站(html)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【问题描述】 请设计一个链表实现链表的初始化、插入、删除和打印操作节点的定义如下: typedef int elementType; typedef struct node { elementType data; node* next; } LList, *PList; 链表的定义及要求如下: class linkedList { public: linkedList();//构造函数 virtual ~linkedList();//析构函数,注意要链表中所有节点的资源 void insert( int value );//警告:必须初始化才能使用! bool initiate();//初始化单链表,使用new操作创建头结点。如果创建失败,则返回false,否则返回true bool isEmpty();//判断单链表是否为空 //删除单链表中第pos个元素结点,并将删除的节点的值存在value中。 //注意:如果链表为空、删除位置大于链表长度、以及删除位置为0的情况,需要终止删除并输出相应信息 bool remove( int pos, int& value ); void print();//顺序打印单链表,如果是单链表为空,则输出 Empty int Length();//返回单链表长度。如果是单链表为空,则返回-1 private: LList *head; int len; }; main函数: int main(int argc, char* argv[]) { linkedList L1; int n; int val; //初始化链表 if(!L1.initiate()) return 0; cin>>n;//输入链表中数据个数 for(int i=0; i<n; i++) //输入n个数,并插入链表 { cin>>val; L1.insert(val); } cout << "Origin Length:" << L1.Length() << endl;//输出链表长度 cout << "data:" ; L1.print();//打印链表 cin>>n;//输入需要删除的数据的位置 if (L1.remove(n,val)) { //删除位置n的数据,并将删除的数据值放在val中 cout<<"Delete the data at position("<<n<<"):"<<val<<endl; cout<< "New Length:" << L1.Length()<< endl;//输出链表长度 cout<< "data:" ; L1.print();//打印链表 } return 0; } 【输入形式】 输入包括3行。 第一行是链表元素个数n。第二行为n个元素的值。第三行为拟删除的数据位置。 【输出形式】 输出格式不固定。具体参见样例。 【样例输入1】 4 1 2 3 4 2 【样例输出1】 Origin Length:4 data:1 2 3 4 Delete the data at position(2):2 New Length:3 data:1 3 4 【样例输入2】 2 100 -1 3 【样例输出2】 Origin Length:2 data:100 -1 pos > len, failed 【样例输入3】 8 8 7 6 5 4 3 2 1 0 【样例输出3】 Origin Length:8 data:8 7 6 5 4 3 2 1 pos <= 0, failed

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值