数据结构_单链表

单链表
头插和尾插
初始化 头节点指针域fu空
单链表的查找:
F10 zhuguocheng
F9 断点
F11zhu语句

#include "stdio.h"
#include "stdlib.h"
#include "time.h"
//单链表存储结构
#define Status int
#define True 1
#define False 0
#define MAXSIZE 20
typedef int ElemType;	//线性表数据类型


//对于每个单链表来说,它所占的空间的大小和位置不需要预先分配划定
typedef struct Node
{
	int data;	//数据域
struct Node *next;	//指针域
}LNode,*LinkList;
//typedef struct Node *LinkList;

//单链表的创建有两种方法,分别是头插法和尾插法

//算法思路:
//创建工作指针p,尾指针L,头指针h
//初始化h的数据域和链域
//用h给L的链域赋值,以此来初始化L
//将数据写入p的数据域
//将p与L前一个结点链接(p->h)
//将L与前一个结点的链接断开,将L与p链接,以此来更新结点

//头插法
//LinkList creat(int n)
//{
//	LinkList p, L,h;	//p为工作指针,L为尾指针,h为头指针
//	L = (LinkList)malloc(sizeof(Node));	
//	h = (LinkList)malloc(sizeof(Node));	//为L,h分配内存
//	h->data = 0;
//	h->Next = NULL;
//
//	L->Next = h;	//初始化L
//	for (int i = 0; i < n; i++)
//	{
//		if ((p = (LinkList)malloc(sizeof(Node))) == NULL)
//		{
//			printf("不能分配空间!");
//			exit(0);
//		}
//		printf("第%d个结点的数据域:", i + 1);
//		scanf("%d", &p->data);
//		p->Next = L->Next;	//将p与L前一个结点链接
//		L->Next = p;	//将L与前一个结点的链接断开,将L与p链接
//	}
//	return L;
//}
LinkList CreatList2()
{ LinkList pL;
  int i,n=0,e;
  LinkList p;
  srand(time(0));
  pL=(LinkList)malloc(sizeof(LNode));
  if(!pL) exit(-1);
	  pL->next=NULL;
  printf("请输入单链表a的长度:\n");
  scanf(" %d",&n);
  for(i=1;i<n;i++)
  {
	  p=(LinkList)malloc(sizeof(LNode));
	  if(!p) exit(-1);
	  p->data=rand()%100+1;
	  p->next=pL->next ;
	  pL->next=p;
  }
  return pL;
}

//尾插法
//LinkList creat(int n)	//链表的初始化
//{
//	LinkList p, h, s; /* *h保存表头结点的指针,*p指向当前结点的前一个结点,*s指向当前结点*/
//	int i;	//计数器
//	if ((h = (LinkList)malloc(sizeof(Node))) == NULL)
//	{
//		printf("不能分配内存空间\n");
//			exit(0);
//	}
//	h->data = n;	//表头结点数据域初始化为表长
//	h->Next = NULL;	//表头结点的链域置空
//	p = h;	//p指向表头结点
//	for (i = 0; i < n; i++)
//	{
//		if ((s = (LinkList)malloc(sizeof(Node))) == NULL)	//分配新存储空间并检测,中介指针的创建
//		{
//			printf("不能分配内存空间\n");
//			exit(0);
//		}
//		p->Next = s;	//将s的地址赋值给p所指向结点的链域,将p与s链接起来
//		printf("第%d个结点的数据域:", i + 1);
//		scanf("%d",&s->data);	//将数据存入当前节点的数据域
//		s->Next = NULL;
//		p = s;	//结点的更新
//	}
//	p->Next = NULL;
//	return h;	//返回链表的头指针
//}
LinkList TCreatList2()
{   LinkList pL;
	int n,e,i;
	LinkList p,q;
	p=pL=(LinkList)malloc(sizeof(LNode));
	if(!pL) exit(-1);
	pL->next =NULL;
	printf("请输入单链表A的长度:\n");
	scanf(" %d",&n);
	for(i=1;i<n;i++)
  {
	  q=(LinkList)malloc(sizeof(LNode));
	  if(!q) exit(-1);
	  printf("请输第%d个数据元素?:\n",i);
	  scanf(" %d",&e);
	  q->data=e;
	  q->next=p->next ;
	  p->next =q;
	  p=q;
  }
  return pL;
}

//打印单链表
Status PrintList(LinkList pL){
	LinkList p;
	p=pL->next;
	if(!p){
		printf("单链表为空\n");
		return False;
	}
	printf("单链表为:\n");
	while(p!=NULL){
		printf("%d\t",p->data);
		p=p->next;
	}
	printf("\n");
	return True;
}
//按序号查找
Status Get_Elem(LinkList pL,int i)
{
	int j;
	LinkList p;
	p=pL->next ;
	j=1;
	while(j<1 && p!=NULL)
	{
		p=p->next ;
		j++;
	}
	if(j>1||!p)
	{
		printf("没有找到\n");
		return False;
	}
	printf("查找位置%d的元素为%d! \n",i,p->data);
	return True;
}
//按数值查找
Status Locate_Node(LinkList pL,ElemType e)
{
	int j=1;
	LinkList p;
	p=pL->next ;
	while(p&&p->data !=e)
	{
		p=p->next ;
		j++;
	}
	if(!p)
	{   printf("查找的元素%d不在单链表A中\n",e);
		return False;
	}
	else
	{
		printf("查找的元素%d最早出现在%d的位置 \n",e,j );
	return True;
	}
}
//插入
Status ListInsert(LinkList pL,int i,ElemType e)
{
	LinkList p=pL,s;
	int j=0;
	while(p && j<i-1)
	{
		p=p->next;
		j++;
	}
	if(!p || j>i-1)
	{   printf("插入位置不合理,无法插入\n");
	    return False;
	}
	s=(LinkList) malloc(sizeof(LNode));
	s->data =e;
	s->next =p->next ;
	p->next =s;
	return True;
}


//删除——按序号
//Status Delete_Elem(LinkList pL,int i){
//	LinkList p=pL,q;
//	int j=0;
//	ElemType e;
//	while(j<i-1&&p->Next!=NULL){
//		p=p->Next;
//		j++;
//
//	}
//	if(j<i-1||!p->Next){
//		printf("删除位置不合理!\n");
//		return False;
//	}
//	q=p->Next;
//	e=q->data;
//	p->Next=q->Next;
//	free(q);
//	printf("删除第%d个,数据元素%d\n",i,e);
//	return True;
//
//}
//删除——按序号
Status Delete_Elem(LinkList pL,int i)
{
	LinkList p=pL,q;
	int j=0;
	ElemType e;
	while(j<i-1 && p->next !=NULL)
	{
		p=p->next;
		j++;
	}
	if(j<i-1 ||!p->next )
	{   
		printf("删除位置不合理\n");
	    return False;
	}
	q=p->next;
	e=q->data;
	p->next =q->next ;
	free(q);
	printf("删除第%d个元素%d\n",i,e);
	return True;
}
//删除——按数值
Status Delete_Node(LinkList pL,ElemType e)
{
	LinkList q=pL->next ,p=pL;
	while(q->data !=e && q)
	{
		p=q;
		q=q->next ;
	}
	if(q->data !=e )
	{   printf("未找到数据\n");
	    return False;
	}
	p->next =q->next ;
	free(q);
	return True;
}
//拓展
Status Delete_All_Node(LinkList pL,ElemType e)
{
	LinkList q=pL->next ,p=pL;
	while(q)
	{
		if(q->data==e)
		{p->next =q->next ;
		free(q);
		q=p->next;
		}
		else{
		p=q;
		q=q->next; 
		}
	}
	return True;
}
LinkList Combine(LinkList La,LinkList Lb)
{
	LinkList Lc=La;
	LinkList pa=La->next,pb=Lb->next ,pc=Lc;
	while(pa!=NULL &&pb!=NULL)
	{
		if(pa->data < pb->data )
		{
			pc->next =pa;
			pc=pa;
			pa=pa->next ;
		}
		else
		{
			pc->next =pb;
			pc=pb;
			pb=pb->next ;
		}
	}
	pc->next =pa?pa:pb;
	free(Lb);
	return Lc;

}
int main()
{
	LinkList L=NULL,La,Lb,Lc;
	int i,e=0;
	int choice=0;
	char select;
	do
	{
		printf("************单链表操作*************\n");
		printf("************1------创建************\n");
	    printf("************2------查询************\n");
		printf("************3------插入************\n");
		printf("************4------删除************\n");
		printf("************5------归并************\n");
		printf("************0------退出************\n");
		printf("**************** ******************\n");
		printf("请选择想要的操作(0-5):\n");
		scanf(" %d",&choice);
	 switch(choice)
	 {
	  case 1: 
		  printf("请选择插入的方法\n");
		  scanf(" %c",&select);
		  switch(select)
		  {
		  case 'A':L=CreatList2();  break;
          case 'B':L=TCreatList2();  break;
		  default:  printf("只能输入A和B!\n");break;
		  }  
		  PrintList(L);
		 break;
	 case 2:
		 printf("请选择查询方法:A按序号查找,B按数值查找\n");
		  scanf(" %c",&select);
		  switch(select)
		  {
		  case 'A':
			  printf("请输入要查询元素的序号\n");
			  scanf(" %d",&i);
			  Get_Elem(L,i);  
			  break;
          case 'B':
			  printf("请输入要查找元素的数值\n");
			  scanf(" %d",&e);
			  Locate_Node(L,e); 
			  break;
		  default:  printf("只能输入A和B\n");break;
		  }  
		 break;
	 case 3:
		 printf("要输入的数据为n");
		  scanf(" %d",&e);
		  printf("要插入的位置为\n");
		  scanf(" %d",&i);
		  if(ListInsert(L,i,e))
		 { printf("插入成功\n");
		  PrintList(L);}
		break;
	 case 4:
		 printf("请选择查询方法:A按序号删除,B按数值查找\\n");
		  scanf(" %c",&select);
		  switch(select)
		  {   case 'A':
			  printf("请输入要删除元素的序号\n");
			  scanf(" %d",&i);
			  Delete_Elem(L,i); 
			  PrintList(L);
			  break;
          case 'B':
			  printf("请输入要查找元素的数值\n");
			  scanf(" %d",&e);
			  Delete_Node(L,e); 
			  PrintList(L);
			  break;
		 case 'C':
			  printf("请输入要查找元素的数值\n");
			  scanf(" %d",&e);
			  Delete_All_Node(L,e); 
			  PrintList(L);
			  break;
		  default:  printf("只能输入A-C\n");break;
		  }  
		 break;
	 case 5:
		 La=TCreatList2();
		 PrintList(La);
		 Lb=TCreatList2();
		 PrintList(Lb);
		 Lc=Combine(La,Lb);
		 PrintList(Lc);
		 break;
	 case 0:
		 printf("退出\n");
			break;
	 default:printf("重新输入\n");
			break;
	 }
	}while(choice);
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值