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)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)