大话数据结构——线性表的链式存储结构~2020.6.27

近日阅读《大话数据结构》自学数据结构的相关知识,将所学成果以代码的形式与大家共享,交流学习。鄙人才疏学浅,码风极其简陋,虽惶恐,仍报以学习的心展示代码,望大犇批评指正。

由于线性表是数据结构中最简单的知识,线性存储结构已于之前的文章中展出,其难度根本不值得一提,有C语言的基础便能应付自如,而今天要展出的线性表链式存储结构的代码,则需要C语言中链表有关的知识。

代码已经在DEV的环境下经过调试,运行一切正常。对于编程大犇来说,其难度根本不值得一提,对于初学数据结构乃至初学C语言链表相关知识(本人初探链表时极其痛苦)的朋友们,本人可以说这是相对友好的参考资料,以下不做详细说明,直接展示代码。代码的要义于注释中加以解释。

注:本人实现该程序所用的语言为C++,并且也强烈推荐使用C++,因为比起C语言(需用malloc,free等极其抽象且不好理解的函数),C++(new,delete一步到位)更好理解。

#include <iostream>
#include <cstdio>
using namespace std;
typedef int ElemType;
struct node{
 ElemType data;
 node *next;
 node *prior;
}*head,*tail;//节点 
/*下为建立链表的函数,为达到锻炼编程能力的目的
本程序中所建的链表同时结合了双向链表与循环链表*/ 
bool setNode(int n){
 if(n<=0) return false;
 
 head=new node;
 tail=new node;
 
 head->data=0;//头节点的data用来存放链表长度 
 head->next=NULL;
 head->prior=tail;
 
 tail->prior=NULL;
 tail->next=head;
 tail->data=0;//尾结点的data无实际意义,当然也可赋予其某项意义,如计算所有节点data数据的总和。 
 
  node *q;
  q=new node;
  cout<<"请输入数据以储存该节点:";
  cin>>q->data;
  head->next=q;
  q->prior=head;
  q->next=tail;
  head->data++;
 for(int i=1;i<n;i++){
  node *p;
  p=new node;
  cout<<"请输入数据以储存该节点:";
  cin>>p->data;
  q->next=p;
  p->prior=q;
  p->next=tail;
  q=p;
  head->data++;
 }
 
 return true;
}//通过头节点进入链表
int main()
{
 /*先建立链表,再删除链表*/
 int n,cnt=1;
 cout<<"输入您想建立的节点数"; 
 cin>>n;
 
 setNode(n); //建立链表 
 node *p=head->next;
 
 //读取链表信息 
 while(p!=tail){
  cout<<"该节点为第"<<cnt++<<"个节点,该节点所储存的信息为:"<<p->data<<endl;
  p=p->next;
 }
 cout<<endl;
 
 cout<<"以下为插入操作,请输入您想要将单个节点插入的位置(插入的位置为指定位置节点之后),否则输入0:";
 int pos;
 cin>>pos;
 
 if(pos!=0&&pos<=cnt){
  node *insert=new node;
  cout<<"请输入数据以储存该节点:";
  cin>>insert->data;
  cnt=0;
  p=head->next;
  while(++cnt<pos){
   p=p->next;
  }
  
  insert->next=p->next;
  p->next=insert;
  insert->prior=p;
  
  cnt=1;
  p=head->next;
  head->data++;
 
  //读取链表信息 
  while(p!=tail){
   cout<<"该节点为第"<<cnt++<<"个节点,该节点所储存的信息为:"<<p->data<<endl;
   p=p->next;
  }
  cout<<endl;
 }
 
 cout<<"以下为删除操作,请输入您想要删除的节点的位置,否则输入0:";
 cin>>pos;
 
 if(pos!=0&&pos<=cnt){
  cnt=0;
  p=head->next;
  while(++cnt<pos){
   p=p->next;
  }
  node *q=p;
  p=p->prior;
  p->next=p->next->next;
  p->next->prior=p;
  
  delete q;
  cnt=1;
  p=head->next;
  head->data--;
 
  //读取链表信息 
  while(p!=tail){
   cout<<"该节点为第"<<cnt++<<"个节点,该节点所储存的信息为:"<<p->data<<endl;
   p=p->next;
  }
  cout<<endl;
 }
 
 //以下为清除链表操作
 p=head->next;
 while(p!=tail){
  node *q=p;
  p=p->next;
  
  delete q;
 } 
 
 delete head;
 delete tail;
 cout<<"Done!Bye~";
 return 0;
 } 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值