int main()
{
Link head//链表(不带头节点)
int n
printf("输入链表的长度n: ")
scanf("%d",&n)
printf("连续输入%d个数据(以空格隔开): ",n)
head=CreateLink(n)
printf("\n原本链表的节点是: ")
DispLink(head)
LinkSort(head)
printf("\n从大到小排序之后: ")
DispLink(head)
printf("\n")
return 0
}
链表的具体存储表示为:
① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的)
② 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer)或链(link))
链式存储是最常用的存储方式之一,它不仅可用来表示线性表,而且可用来表示各种非线性的数据结构。
以上内容参考:百度百科-单链表
#include<iostream>#include<string>
using namespace std
class infoOrder
{
public:
char PID[5]
int amount
void get(char p[],int n)
{
/*cout<<"Enter the PID"<<endl
memset(PID,0,5)
cin>>PID
cout<<"Enter the amount"<<endl
cin>>amount
cin.ignore()*/
memset(PID,0,5)
strcpy(PID,p)//产品代码
amount=n//订购数量
}
void display()//显示单个产品条目的信息
{
cout<<"产品代码:"<<PID<<","<<"产品数量:"<<amount<<endl
}
}
class Node
{
public:
//infoOrder *info
infoOrder info//直接定义实体就可以了,没必要用指针。
Node *NEXT //链表接点指针
Node (char *p,int n)/*infoOrder *s=NULL,Node *n=NULL*//*:info(s),NEXT(n) */
{
info.get(p,n)
}
}
class List
{
private:
Node *START
/* *CURRENT,
*PRECEDE*/
public:
List()
{
START=NULL/*=CURRENT=PRECEDE=*/
}
~List()
{
destroy()
}
void addNode(infoOrder *s) //增加购买条目
bool delNode(infoOrder *s) //删除某个购买条目
bool updateNode(infoOrder *s)//更新某个购买条目的数量
void traverse()//显示购买清单
void destroy() //销毁购买清单
}
void List::destroy()
{
/*while(START!=NULL)
{
CURRENT=START
START=START->NEXT
delete CURRENT
}*/
//START=PRECEDE=CURRENT=NULL
START=NULL
}
void List::addNode(infoOrder *s)
{
/*if(START==NULL||s<=START->info) //为什么START=NULL就是节点为空?最后一个节点指针也是空啊?
{
START=new Node(s,START)
return
}
Node *prev,*curr
for(prev=curr=STARTcurr!=NULL&&s>curr->infoprev=curr,curr=curr->NEXT)
Node *n=new Node(s,curr)
prev->NEXT=n*/
if(START==NULL)//链表为空时
{
START=new Node(s->PID,s->amount)
START->NEXT=NULL
}
else//链表为非空时,插到表头
{
Node *p=new Node(s->PID,s->amount)
p->NEXT=START
START=p
}
}
bool List::updateNode(infoOrder *s)
{
/*for (PRECEDE=CURRENT=STARTCURRENT&&s!=CURRENT->infoPRECEDE=CURRENT,CURRENT=CURRENT->NEXT)
return(CURRENT!=NULL)*/
Node *p=START
for(pp!=NULLp=p->NEXT)//循环查找匹配的产品
{
if(strcmp(p->info.PID,s->PID)==0)//找到要修改的接点。
{
p->info.get(s->PID,s->amount)
}
}
return true
}
void List::traverse()
{
Node *p=START
if(START!=NULL)
{
cout<<"产品清单为:"<<endl
for(pp!=NULLp=p->NEXT)//循环显示每一个产品
{
//p->info.display
cout<<"商品代码"<<p->info.PID<<","<<"商品数量"<<p->info.amount<<endl
}
}
else
{
cout<<"清单为空"<<endl
}
}
bool List::delNode(infoOrder *s)
{
int flag=0
/*if(queryNode(s)==false)
{
return false
}
PRECEDE->NEXT=CURRENT->NEXT
if(CURRENT==START)
{
START=START->NEXT
}
delete CURRENT*/
if(START==NULL)
{
cout<<"清单为空,删除 *** 作失败"<<endl
}
else
{
Node *p=START
Node *p1=START
for(pp!=NULLp=p->NEXT)//循环查找匹配的产品
{
if(strcmp(p->info.PID,s->PID)==0)
{
flag=1
break
}
}
if(p==START)//删除头结点
{
START=START->NEXT
p->NEXT==NULL
delete p
}
else if(p!=NULL)
{
for(p1=STARTp1->NEXT!=pp1=p1->NEXT)//删除非头结点,找到p的前一个接点。作好删除准备
p1->NEXT=p->NEXT
p->NEXT=NULL
delete p
}
}
if(flag==0)
{
cout<<"清单中没有要删除的商品"<<endl
}
return true
}
int main()
{
infoOrder *sh
sh=new infoOrder
List obj
char name[5]
int num
int flag=1
while(flag)
{
cout<<"1.Enter name:"<<endl
cout<<"2.Delete name:"<<endl
cout<<"3.Update node:"<<endl
cout<<"4.Display name:"<<endl
cout<<"5.Destroy the list:"<<endl
char ch
cin>>ch
switch(ch)
{
case '1'://添加结点
{
cout<<"输入要填加的商品和采购数量"<<endl
cin>>name
cin>>num
sh->get(name,num)
obj.addNode(sh)
}
break
case '2'://删除结点
{
cout<<"输入要删除的商品和采购数量"<<endl
cin>>name
cin>>num
sh->get(name,num)
if(obj.delNode(sh)==false)
{
cout<<"not found"<<endl
}
}
break
case '3'://修改结点
{
cout<<"输入要修改的商品和采购数量"<<endl
cin>>name
cin>>num
sh->get(name,num)
/*if(obj.queryNode(sh)==false)
{
cout<<"not found"<<endl
}
else
{
cout<<"found in list"<<endl
}*/
obj.updateNode(sh)
}
break
case '4'://遍历结点
obj.traverse()
break
case '5'://清空清单
obj.destroy()
break
}
cout<<"继续 *** 作请输入1,退出请输入0"<<endl
cin>>flag
}
delete sh
return 0
}
MB的,看楼主的帖子很累.不加我都不行了.
在linux内核中,有大量的数据结构需要用到双循环链表,例如进程、文件、模块、页面等。若采用双循环链表的传统实现方式,需要为这些数据结构维护各自的链表,并且为每个链表都要设计插入、删除等 *** 作函数。因为用来维持链表的next和prev指针指向对应类型的对象,因此一种数据结构的链表 *** 作函数不能用于 *** 作其它数据结构的链表。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)