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;
}

posted on 2019-04-08 23:53  卢思林  阅读(179)  评论(0编辑  收藏  举报