单链表的基本操作(一)

#include<stdio.h>
#include<stdlib.h>
typedef int Status;
typedef struct node //定义一个单链表结点类型 
{
	int data;// 每个结点存放一个数据元素 
	struct node *next;//指针指向下一个结点 
 }LNode,*LinkList; //定义一个结点。
//LNode *L(强调指向结点的指针),LinkList L(强调为单链表) 
//(*L)就是个Node型的结构体了,可以用点运算符访问该结构体成员,即(*L).elem 
//利用头插法逆序建立单链表(逆向插入,此方法有头节点) 
 LinkList HeadInsert(LinkList &L,int a[],int n)
 {
 	LNode *s;
	int x;
	L=(LinkList)malloc(sizeof(LNode));//创建头节点;
	L->next = NULL; //c初始化为空链表
	for(int i=0;i<n;i++)
	{
		s = (LNode*)malloc(sizeof(LNode));//创建一个新结点 
		s->data = a[i];
		s->next = L->next;  //第一个为null。 
		L->next=s; 
	}
	return L;
  } 
//按值查找结点的位序 
Status searchElem(LinkList L,int e)
{
	LNode *p = L->next;
	int i = 1;
	while(p != NULL)
	{
		if(p->data == e)
		{
			return i;
		}
		p = p->next;
		i++;
	}
	return false;
 } 
 //按位序查找结点的值
LNode *LocateElem(LinkList L,int i)
 {
 	int j = 1;
 	LNode *p = L->next;
 	if(i ==0)
 	{
 		return L;
	}
	if( i<0 )
	{
		return NULL;
	}
 	while(p != NULL && j<i)
 	{
 		p = p->next;
		j++;	
	}
	return 	p;
  } 
  //按位序插入结点操作;
  Status ListInsert(LinkList &L,int i,int e) 
  {
  	if(i<1)//输入位序是否合法; 
  	{
  		return false;
	}
	LNode *p;
	p = L->next;
	int j=1;
	while(p != NULL && j<i-1)//要找到i的前驱结点i-1。 
	{
		p = p->next;
		j++;
	}
	if(p == NULL)//i值不合法 
	{
		return false; 
	}
	LNode *s;//创建一个插入结点 
	s =(LNode*)malloc(sizeof(LNode));
	if(s == NULL)//内存分配失败 
	{
		return false; 
	} 
	s->data = e;//插入数据;
	s->next = p->next; 
	p->next = s;//将结点连接到P之后 
	return true;
  }
  //按位序上的删除结点
  Status DeleteList(LinkList &L,int i)
  {
  	if(i<1)
  	{
  		return false;
	}
	//找到第i-1的结点
	LNode *p;
	LNode *q;
	p = (LNode*)malloc(sizeof(LNode));
	p = L->next;
	int j=1;
	while(p != NULL && j<i-1)
	{
		p = p->next;
		j++; 
	} 
	if(p==NULL)
	{
		return false; 
	}
	//找到i-1个结点的位置。 
	q = p->next;
	p->next = q->next;
	free(q);
	return true;
  } 
  //遍历输出链表的值
  void  PrintList(LinkList L)
  {
  	LNode *p;
  	p = L->next;
  	int count = 1;
  	printf("该单链表值为:");
  	while(p != NULL)
	{
		printf("%d ",p->data);
		p=p->next;
		count++;
	}
	printf("\n");
  } 
  //主函数
  int main()
  {
  	LinkList L;//L是指向定义的node结构体的指针
  	LNode *p;
  	int n,x,i,e;
  	int a[100];
  	printf("请输入数组个数:");
	scanf("%d",&n);
    for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	//测试头插法建立链表; 
  	HeadInsert(L,a,n);
  	//输出建立后的链表 
  	PrintList(L);
  	//按值查找;
	printf("输入你要查找的数字:");
	scanf("%d",&x); 
	if(searchElem(L,x))
	{
	 	printf("找到值为%d的坐标为%d\n",x,searchElem(L,x));
	}
	else
	{
	 	printf("没有找到该数字。\n");
	}
	//按位序查找
	printf("输入你要查找的位序:");
	scanf("%d",&i); 
	p = LocateElem(L,i);
	if(p)
	{
		printf("找到位序%d的值为%d\n",i,p->data);
	}
	else
	{
		printf("没有找到。\n");
	}
	//在某按位序插入结点;
	if(ListInsert(L,2,3))
	{
		printf("插入成功,插入后的顺序表:\n");
		PrintList(L);
	}
	else
	{
		printf("插入失败,插入位序不合法。\n");
	}
	if(DeleteList(L,2))
	{
		printf("删除成功,插入后的顺序表:\n");
		PrintList(L);
	}
	else
	{
		printf("删除失败,插入位序不合法。\n");
	}
   } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值