编写程序,建立一个带有节点的单向链表,输入字符串,并按从小到大顺序组织到链表中

编写程序,建立一个带有节点的单向链表,输入字符串,并按从小到大顺序组织到链表中,第1张

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指针指向对应类型的对象,因此一种数据结构的链表 *** 作函数不能用于 *** 作其它数据结构的链表。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8289933.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-15
下一篇 2023-04-15

发表评论

登录后才能评论

评论列表(0条)

保存