c++链表及菜单设计

c++链表及菜单设计,第1张

/*哇!终于做好了,真是的,从7点做的,居然做到现在,呵呵~~,不过,都可以运行了,可以满足楼主您的要求了,代码如下:*/,#include<iostream.h>typedef int datatype //结点数据类型,假设为 int

typedef struct node * pointer// 结点数据类型

struct node{

int number

datatype data

pointer next

}

typedef pointer iklist //单链表类型,即头指针类型//建表

iklist creat()

{

pointer head,rear,s

int ch,num=1

head=new node//生成头结点

rear=head//尾指针初值指向头结点

cout<<"请输入链表的数据(以输入0结束):\n"

while(cin>>ch,ch!=0){ // 读入结点值,并检测是否为结束符

s=new node //生成新结点

s->data=ch

s->number=num

num++

rear->next=s//非空表,新结点 *s 插入到尾指针 *rear 之后

rear=s //尾指针 rear 指向新的表尾;

}

rear->next=NULL //尾结点的后继指针置空

return head //返回单链表头指针

}//初始化

iklist initlist(){

pointer head

head=new node

head->next=NULL

return head

}//按序号查找

pointer find(iklist head,int i){

int j

pointer p

if(i<0) return NULL//位置非法,无此结点

j=-1 //计数器

p=head //从头结点考试搜索

while(p!=NULL &&j<i){

j++

p=p->next //没有搜索到第 i 个结点,继续下一个结点

}

return p

}//插入

int insert(iklist head,datatype x,int i){

pointer q,s

q=find(head,i-1)//找到第 i-1 个结点位置

if(q==NULL) {cout<<"非法插入位置!\n"return 0} //无第 i-1 个结点,即i<1 或 i>n+1时;

s=new node //生成新结点

s->data=x

s->next=q->next

q->next=s

return 1 //插入成功!

}//按序号删除

int deletei(iklist head,int i){

pointer p,q

q=find(head,i=1) //找待删点的直接前趋

if(q==NULL || q->next==NULL) {cout<<"非法删除位置!\n"return 0}//即i<1 或i>n

p=q->next//保存待删点的地址,用于释放空间

q->next=p->next //修改前趋的指针

delete p //释放已删除的结点空间

return 1 //删除成功

}//表长

int length(iklist head){

int j=0 //计数器

pointer p

p=head->next //从首结点开始搜索

while(p!=NULL){

j++

p=p->next

}

return j

}//定位

int locate(iklist head,datatype x){

int j

pointer p

j=0 //计数器

p=head->next //指向首结点,从首结点开始扫描

while(p!=NULL){

j++

if(p->data==x) break //找到了x,退出循环

p=p->next //没有找到,继续扫描下一个结点

}

if(p->data==x) return j //找到了x

else return -1

}//显示链表

void show(iklist head){

head=head->next

for(int i=1head!=NULLi++){

cout<<"number: "<<i<<" data: "<<head->data<<endl

head=head->next

}

}

void main()

{

iklist L

int ch,i,k

datatype x

L=initlist()

XX: do

{

cout<<" 主菜单\n"

<<" 1.尾插建表\n"

<<" 2.插入\n"

<<" 3.按序号删除\n"

<<" 4.退出程序\n"

<<" 5.求表长\n"

<<" 6.定位(按值查找)\n"

<<" 7.显示链表\n"

<<endl

cin>>ch

switch(ch)

{

case 1:

L=creat()

if(L!=NULL) cout<<"链表已建成!\n"

else cout<<"链表建立失败\n"

break

case 2:

cout<<"输入插入位置号 \n"

cin>>i

if(i<0 ||i>length(L))

{cout<<"插入位置非法!\n"break}

cout<<"还有插入位置 "<<i<<" 的数值:"

cin>>x

k=insert(L,i,x)

if(k) cout<<"插入成功!\n"

else cout<<"插入失败!\n"

break

case 3:

cout<<"输入删除位置号 \n"

cin>>i

if(deletei(L,i)) cout<<"删除成功!\n"

else cout<<"删除失败!\n"

break

case 4:

case 0:

delete(L)//退出程序时释放链表空间

break

case 5:

cout<<"链表的长度是: "<<length(L)<<endl

break

case 6:

cout<<"请输入要查找的值: "<<endl

cin>>x

cout<<x<<" 在该链表的位置是(-1表示查找不到!): "<<locate(L,x)<<endl

break

case 7:

cout<<"显示链表:\n"

show(L)

break

default:

cout<<"非法输入! 请重新输入... ....\n"

goto XX

}

cout<<"-------------------------------------------------------"

} while(1)

}//希望对你有帮助,.^_^.

#include<stdio.h>

#include<stdlib.h>

typedef

int

datatype

typedef

struct

node

{

datatype

data

struct

node

*next

}linklist

linklist

*head

linklist

*hrear_creat()//建立链表

{

int

x

linklist

*head,*p,*rear

head=(struct

node*)malloc(20)

head->data=-999

rear=head

//clear()

printf("请输入互不相同的正整数以0结束:\n\t")

scanf("%d",&x)

while(x!=0)

{

p=(struct

node*)malloc(20)

p->data=x

rear->next=p

rear=p

scanf("%d",&x)

}

rear->next=NULL

return(head)

}

linklist

*key_delete(linklist

*head)

{

void

print(linklist

*rb)

linklist

*p,*q

int

x,y,i

printf("请输入要删除的起始结点:\n\t")

scanf("%d",&x)

printf("请输入要删除结点的个数:\n\t")

scanf("%d",&y)

p=head

while(

p

&&

(p->data!=x)

)

{

q

=

p

p=p->next

}

if(p!=NULL)

{

for(i=1i<=yi++)

{

p

=

q->next

if

(

p

==

NULL

)

break

q->next

=p->next

free(p)

}

return(head)

}

else

{

printf("\n\t要删除的结点不存在,请重新输入数据!\n",x)

return(NULL)

}

}

void

print(linklist

*rb)

{

linklist

*p,*head

int

n=0

head=rb->next

printf("链表中的数据为:\n\t%5d",head->data)

p=head->next

while(

p

)

{

printf("%5d",p->data)

p=p->next

n=n+1

if((n+1)%10==0)

printf("\n\t")

}

printf("\n\t")

}

int

main()

{

linklist

*p

p=hrear_creat()

print(p)

key_delete(p)

print(p)

}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存