近日阅读《大话数据结构》自学数据结构的相关知识,将所学成果以代码的形式与大家共享,交流学习。鄙人才疏学浅,码风极其简陋,虽惶恐,仍报以学习的心展示代码,望大犇批评指正。
由于线性表是数据结构中最简单的知识,线性存储结构已于之前的文章中展出,其难度根本不值得一提,有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;
}