include<stdio.h>
include<stdlib.h>
typedef struct node{ //定义
int data;
struct node link;
}Linknode,LinkList;
void construct(LinkList &L,int ending){ //单链表初始化,赋值 (尾插法)
int val;
printf("请输入数据:");
scanf("%d",&val);
if(val==ending) {
L=NULL;
printf("此链表为空!") ;
return;
}
else {
L=(Linknode*)malloc(sizeof(Linknode)); //创建头节点
if(!L){
printf("存储分配失败!");
exit(1); //返回
}
L->data=val;
construct(L->link,ending); //L=L->link;
}
}
void length(LinkList &L){ //计算链表长度
Linknode *p=L->link; //p指向第一个节点
int num=0; //num表示链表长度
while(p!=NULL){
p=p->link;
num++;
}
printf("链表的长度为:%d\n",num);
}
void locatedata(LinkList &L){ //根据逻辑序号查找对应的数据
int a,j=1;
Linknode *p=L->link; //p指向第一个节点
printf("请输入要查找元素的逻辑序号:");
scanf("%d",&a);
printf("\n");
while(p!=NULL&&j<a){
p=p->link;
j++;
}
if(p==NULL){
printf("逻辑序号超出链表长度!\n");
}else printf("逻辑序号为%d,在链表中对应的数据为:%d\n",a,p->data);
}
void number(LinkList &L){ //根据数据找到逻辑序号
Linknode *p=L->link; //p指向第一个节点
int a,j=1;
printf("请输入要查找的元素:");
scanf("%d",&a);
printf("\n");
while(p!=NULL&&p->data!=a){
p=p->link;
j++;
}
if(p==NULL){
printf("要查找的元素不在这个链表中!\n");
} printf("要查找的元素%d的逻辑序号为:%d\n",a,j);
}
LinkList locate(LinkList &L,int i){ //根据逻辑序号查找对应的位置
int a,j=1;
Linknode *p=L->link;
while(p!=NULL&&j<i){
p=p->link;
j++;
}
return p;
}
void insert(LinkList L){ //插入数据
LinkList p;
int a,b;
printf("请输入要插入的元素:");
scanf("%d",&a);
printf("\n");
printf("请输入要插入的逻辑序号:");
scanf("%d",&b);
p=locate(L,b-1); //调用locate()函数 ,找到要插入的前一个位置
if(p==NULL) {
printf("插入位置不当!");
return;}
Linknode *s=(Linknode*)malloc(sizeof(Linknode)); //创建新的节点
if(s==NULL){
printf("存储分配失败!\n");
exit(1); //返回
} s->data=a; // s的数据域为a
s->link=p->link; //先连
p->link=s; //再断
return;
}
void printfdata(LinkList L ){ //输出单链表
if(L==NULL) return;
printf("%d\t",L->data); //表示第一个节点的数据
printfdata(L->link);
}
void remove(LinkList &L){ //删除数据
int a;
Linknode *p;
printf("请输入要删除元素的逻辑序号:");
scanf("%d",&a);
p=locate(L,a-1); //找到删除数据的前一个位置
if(p==NULL||p->link==NULL){
printf("删除元素的逻辑序号不符合条件!\n");
return;
}
Linknode *q;
q=p->link;
p->link=q->link;
free(q); //销毁q
}
int main(){
Linknode L,p;
int ending;
L=(Linknode*)malloc(sizeof(Linknode)); //创建头节点
if(!L){ //如果L为空,则执行。
printf("存储分配错误!\n");
exit(1); //表示退出函数
}
printf("请输入约定的输入序列结束标志:");
scanf("%d",&ending);
p=L; //p指向头节点
construct(p->link,ending); //调用创建、初始化函数construct();
length(L); //调用长度函数length();
locatedata(L);
number(L);
printf("输出所以元素:");
printfdata(L->link); //将L->link=L;
printf("\n");
insert(L);
printf("输出所以元素:");
printfdata(L->link);
printf("\n");
remove(L);
printf("输出所以元素:");
printfdata(L->link);
return 0;
}