数据结构单链表(王道讲解部分自己写的代码)-----2020/7/14

#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
	int data;
	struct LNode *next;
 }LNode,*LinkList;
 LinkList List_headinsert(LinkList &L)   //头插法建立单链表 
 {
 	LNode *s;
 	int x=0;
 	L=(LinkList)malloc(sizeof(LNode));
 	L->next=NULL;
 	printf("请输入:\n");
 	scanf("%d",&x);
 	while(x!=999)
 	{
 		s=(LNode *)malloc(sizeof(LNode));
 		s->next=L->next; 
		s->data=x;
		L->next=s;
		printf("请输入:\n");
		scanf("%d",&x); 
	 }
	 return L;
 }
 LinkList list_endinsert(LinkList &L)   //尾插法建立单链表 
 {
 	LNode *s;
 	int x;
 	L=(LinkList)malloc(sizeof(LNode));
 	L->next=NULL;
	printf("请输入:\n");
	scanf("%d",&x); 
	LNode *p=L;
 	while(x!=999)
 	{
 		s=(LNode *)malloc(sizeof(LNode));
 		s->data=x;
		s->next=p->next;
		p->next=s;
 		p=s;
 		printf("请输入:\n");
 		scanf("%d",&x);
	 }
	 return L;
  } 
  void print(LNode *L)      //遍历 
  {
  	LNode *p=L->next;
  	while(p!=NULL)
  	{
  		printf("%d  ",p->data);
  		p=p->next;
	  }
  }
  LNode *search(LinkList L,int e)    //按值查找结点 
  { 
  	LNode *p=L->next;
  	while(p!=NULL)
  	{
  		if (p->data==e)
  			return p;
  		else 
  			p=p->next;
	  }
	return NULL;
  }
   LNode *search_hao(LinkList L,int e)    //按序号查找结点 
  { 
  	LNode *p=L->next;
  	int i=1; 
  	while(p!=NULL)
  	{
  		if (i==e)
  			return p;
  		else 
  			p=p->next;
  			i+=1;
	  }
	return NULL;
  }
  bool INsert(LinkList &L,int e)  //在链表第e个位置上插入一个元素
  {
  	int i=1,x,j=0;
  	LNode *s,*p=L->next,*q=L;
  	s=(LinkList)malloc(sizeof(LNode));
  	printf("请输入x:\n");
	scanf("%d",&x); 
	s->data=x;
	s->next=NULL;
	while(p!=NULL)
	{
		p=p->next;
		q=q->next;
		j++;
	}
	printf("j:%d\n",j);
	if (e<1||e>j+1)  //注意:若链表有j个节点则要插入的节点可以在j+1的位子上 
		return false;
	else
	{
		if (e<=j)
		{
			printf("e<=j\n"); 
			p=L->next;
			while(p!=NULL)
			{
				if (i==e)
				{
					s->next=p;
					q->next=s;
					return true;
				}
				else
				{
					p=p->next;
					q=q->next;
					i+=1;
				}
			}
		}
		if(e==j+1)
		{
			p=q;
			p->next=s;
			return true;
		}
	 } 
	return false;
   } 
   bool INsert_after(LinkList &L,int e)   //插入到节点的后边 
   {
	int i=1,x=0;
	LNode *s,*p=L->next;
  	s=(LinkList)malloc(sizeof(LNode));
  	printf("请输入x:\n");
	scanf("%d",&x); 
	s->data=x;
	s->next=NULL;
	while(p!=NULL)
	{
		if (i==e)
		{
			s->next=p->next;
			p->next=s;
			return true;
		}
		else
		{
			p=p->next;
			i+=1;
		}
	 }
	return false;
   }
   bool deletelist(LinkList &L,int e) //删除值为e的结点
   {
   	/*法一: 
   	LNode *p=L->next,*q=L;
   	while(p!=NULL)
   	{
   		if (p->data==e)
   		{
   			q->next=p->next;
   			free(p);
   			return true;
		   }
		else
		{
			q=q->next;
			p=p->next;
		}
	}
	return false;
	*/
	//法二:
	LNode *p=L->next;
   	while(p!=NULL)
   	{
   		if (p->data==e)
   		{
   			p->data=p->next->data;
   			p->next=p->next->next;
   			free(p->next);
   			return true;
		   }
		else
		{
			p=p->next;
		}
	}
	return false;
   } 
  int main()
  {
  	LNode *L1,*L2,*p;
  	L1=List_headinsert(L1);
  	printf("\n");
  	printf("=====");
  	printf("\n");
  	L2=list_endinsert(L2);
  	print(L1);
  	printf("-----------\n");
  	print(L2);
  	printf("+++++\n");
  	p=search(L1,1);
  	if (p!=NULL)
  		printf("值为1的结点的值:%d\n",p->data);
  	else
	  printf("NULL");
	p=search_hao(L2,3);
	if (p!=NULL)
  		printf("序号为3的节点的值:%d\n",p->data);
  	else
	  printf("NULL");
	if (INsert(L2,4)==true)
		printf("插入成功!\n");
	else
		printf("插入失败!\n");
	printf("插入后的链表:\n");
	print(L2);
	printf("*******\n");
	if (INsert(L1,5)==true)
		printf("插入成功!\n");
	else
		printf("插入失败!\n");
	printf("插入后的链表:\n");
	print(L1);
	printf("%%%%%%%%%%%%%%\n");
	if(deletelist(L1,2)==true)
	{
		printf("删除成功!\n");
	 } 
	else
		printf("删除失败!\n");
	printf("删除后的链表:\n");
	print(L1);
  	return 0;
  }

注:若链表共有m个节点:在使用前插法插入元素时,节点插入到第m+1个位置是特殊情况应特别考;若使用后插法则无需考虑。
**

明天写双链表的讲解部分-----7/14

**

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值