单链表的基础操作

一、实验目的

1.深入了解线性表的链式存储结构。

2.熟练掌握在链式存储结构上进行插入、删除等操作的算法。

3.通过线性表结构解决现实中的一些问题。

二、实验内容

1. 线性表的链式存储结构。

2. 链式存储结构上进行插入、删除等操作的算法。

3. 通过线性表结构解决现实中的一些问题。

#include <stdio.h>

#include <malloc.h>

typedef int Elemtype;

typedef struct node{

   int data;    

   struct node *next; 

}Node,*LinkList;   

LinkList L;     

1.从表头建立

2.从表尾建立

3.求长

4.按位查找

5.按值查找

6.插入

7.删除

8.打印链表

测试

1.链表建立

2.序号查找

3.按位查找

4.删除

5.求长

6.插入

完整源码

#include <stdio.h>
#include <malloc.h>
typedef int Elemtype;	
typedef struct node{	
	int data;		
	struct node *next;	 
}Node,*LinkList;		
LinkList L;			 
 
//在表头插入结点 
LinkList Create1(){
	L = NULL;						//定义L为空链表
	int x;									//设数据元素为int类型
	Node *s;
	scanf("%d",&x);
	while(x!=-1){
		s = (Node*)malloc(sizeof(Node));	//申请内存
		if(s==NULL){
			printf("申请内存空间失败!");
			break;
		} 
		s->data = x;					 
		s->next = L;						
											 
		L = s;
		printf("请继续输入(-1结束):");								
		scanf("%d",&x);
	} 
	return L;								//返回头指针,通过头指针可以遍历该链表 
} 
 
//在表尾插入结点
LinkList Create2(){
	L = NULL;
	Node *s;	//定义结点 
	Node *r;	//定义尾指针,永远指向最后一个结点 
	int x;
	s = (Node*)malloc(sizeof(Node));	//定义头结点,申请内存
	if(s==NULL){
		printf("申请内存空间失败!");
	}
	s->next = NULL;
	L = s;	
	r = s; 	
	scanf("%d",&x);
	while(x!=-1){
		s = (Node*)malloc(sizeof(Node));
		if(s==NULL){
			printf("申请内存空间失败!");
			break;
		}	
		s->data = x;
		s->next = NULL;
		r->next = s;	//将尾结点的next指向最新的结点 
		r = s;			//尾指针指向最新的结点 
		printf("请继续输入(-1结束):"); 
		scanf("%d",&x);
	}
	return L; 
}
 
//求长  
int Length1(LinkList L){
	Node *p = L;
	int j=0;
	while(p->next){
		p = p->next;
		j++;
	}
	return j; 
}
 
//求长 (带头结点) 
int Length2(LinkList L){
	Node *p = L;			//非空表下指向的就是第一个结点 
	int j=0;
	while(p){
		j++;
		p = p->next;
	}
	return j; 
}
 
//查找(序号) 
Node *Get(LinkList L,int i){
	Node *p = L;
	int j=0;
	while(j<i&&p->next!=NULL){
		p = p->next;
		j++;
	}
	if(j==i)
		return p;
	else
		return NULL;
} 
 
// 按值查找
 Node *Locate(LinkList L,int x){
	Node *p = L->next;
	while(p!=NULL&&p->data!=x){
		p = p->next;
	}
	return p;
} 
 
//插入 
int Insert(LinkList L,int i,int x){
	Node *p,*s;
	p = Get(L,i-1);	//获取第i-1个结点
	if(p==NULL){
		printf("参数i错误!\n");
		return 0; 
	}
	else{
		s = (Node*)malloc(sizeof(Node));	//申请、填装结点 
		if(s==NULL){
			printf("申请内存空间失败!");
			return 0;
		}
		s->data = x;
		s->next = p->next;
		p->next = s;
		return 1; 		
	} 
 
}
 
//删除结点
int Delete(LinkList L,int i){
	LinkList p,s;
	p = Get(L,i-1);	//获取第i-1个节点
	if(p==NULL){
		printf("第i-1个结点不存在\n");
		return -1; 
	}else if(p->next==NULL){
		printf("第i个结点不存在");
		return 0;	
	}else{
		s = p->next;
		p->next = s->next;
		free(s);	//释放*s; 
		return 1; 
	} 
}
 
//遍历链表
void Recycle(LinkList L){
	Node *p = L->next;
	int i=0;
	while(p){
		i++;
		printf("---->|结点%d->数据:%d|\n",i,p->data);
		p = p->next;
	} 
} 
 

//单链表的建立
//int Create(LinkList L)
//{
//	while(1)
//	{
//		int x;
//		printf("1.从头建立单链表  2.尾端建立单链表\n");
//		printf("请输入你要进行操作的选项:\n"); 
//		
//		scanf("%d",&x);
//		switch(x)
//		{
//			case 1:Create1();
//			       printf("--------------------------------\n");
//				   break;
//			case 2:Create2();
//			       printf("--------------------------------\n");
//				   break; 
//		}
//		break;
//	}
// } 
 

 void list()
 {
 	printf("1.单链表的建立 2.按位查找 3.按值查找\n");
 	printf("4.删除 5.单链表的遍历 6.求长 7.插入\n");
 	printf("--------------------------------\n");
 }
 
 
int main(){
	list();
	LinkList L;
 	int n;
// 	InitList(H);
 
    while(true)
    {
    	int n;
		int flag =1;
		int length,i,number,item;//item用于Insert插入和Detele删除的返回数据 
		Node *p;
	
    	printf("请输入你要进行的操作:\n");
    	scanf("%d",&n);
    	switch(n)
    	{
    		case 1:
			      printf("请继续输入(-1结束):\n");			//若输入-1,则表示链表元素创建完成 
				L = Create2();
				printf("--------------------------------------------------------\n");
				break;
             
    		case 2:
			       printf("请输入你要查找的序号:  ");//请输入你想查找的序号 
				scanf("%d",&i);
				if(L==NULL)
				{	
					printf("抱歉!错误!\n-------------------------------------------------\n");
					break;
				}
				p =Get(L,i);
				if(p==NULL){
					printf("抱歉!错误!\n----------------------------------------------\n");			//第i个位置为NULL,错误 
				}else{
					printf("成功!该值为:%d\n--------------------------------------\n",p->data);//不为NULL,查找成功,输出该结点数据域 
				} 	
			break;
			case 3: 
			      printf("请输入你要查找的数值:\n ");
				scanf("%d",&number);
				if(L==NULL)
				{	
					printf("抱歉!错误!\n-------------------------------------------------\n");
					break;
				}
				p = Locate(L,number);
				if(p==NULL)
					printf("抱歉!错误!\n-------------------------------------------------\n");			//第i个位置为NULL,错误 
				else
				{
					printf("成功\n-------------------------------------------\n");
					Recycle(L);
				}
					//不为NULL,查找成功,输出该结点数据域  
			break;

			     
    		case 4:
    			  
			      printf("请输入要删除的位置:");
				  
				scanf("%d",&i);
				item = Delete(L,i);
				if(item==0 || item==-1)
					printf("删除失败!----------------------------------------------------------\n");
				else
					printf("删除成功!-------------------------------------------------------------\n");
			break;

			case 5:
			      Recycle(L);
			      printf("--------------------------------\n");
			      break;
			case 6:
				  
				  if(L==NULL)
				{	
					printf("抱歉!错误!\n-------------------------------------------------\n");
					break;
				}
				length = Length1(L);
				printf("该单链表的长度为: %d\n-------------------------------------\n",length);		//单链表的长度为: 
			break;	

			case 7:
				  printf("请输入你要插入的位置和元素:");
				  scanf("%d%d",&i,&number);
				  item = Insert(L,i,number);
				  if(item==0)
				    	printf("插入失败-----------------------------------------------------\n");
				  else
				    	printf("插入成功--------------------------------------------------------\n");
                break;
			  
				  
				 default:
				printf("Sorry!You can't do that!\n");
				flag = -1;
			break;	
		}
		if(flag==-1)
		break;
	
 
		}
	
	return 0;
 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值