单链表的基本操作及应用

单链表操作详解

实验: 单链表的基本操作及应用

- 实验目的

  • 掌握单链表的创建,插入、删除、查找和打印算法;

- 实验内容

  • 基本要求:

(1)实现单链表的创建;(2)实现单链表的插入;(3)实现单链表的删除
(4)实现单链表的查找;(5)实现单链表的显示;

#include<stdio.h>
#include<stdlib.h>

typedef int ElemType;
//结构体部分 
typedef struct LNode
{
	ElemType data;
	struct LNode *next;
}Linklist;
//初始化链表 
Linklist *InitList(Linklist *L)
{
	L = (Linklist *)malloc(sizeof(Linklist));
	L->next = NULL;
	return L;
}
//创建单链表
Linklist *CreateList(int n)
{
	int x,i;
	Linklist *L,*r,*p;
	L = InitList(L);
	r = L;
	for(i=0;i<n;i++)
	{
		scanf("%d",&x);
		p = (Linklist *)malloc(sizeof(Linklist));
		p->data = x;
		p->next = NULL;
		r->next = p;
		r = r->next;
	}
	return L; 
}
//插入
int Insert(Linklist *L,ElemType item,int x)
{
	int i = 1;
	Linklist *p,*t;
	p = L;
	t = (Linklist *)malloc(sizeof(Linklist));
	t->data = item;
	if(L->next==NULL)
	{
		if(x==1)
		{
			L->next=t;
			t->next=NULL;
			return 1;
		}
		else
		{
			printf("操作失败!\n");
			return 0;
		}
	}
	while(p->next!=NULL&&i<x)
	{
		p = p->next;
		i++;
	}
	if(p->next==NULL&&i<x)
	{
		printf("在%d位置处插入失败!\n",x);
		return 0;
	}
	else
	{
		t->next = p->next;
		p->next = t;
		return 1;
	}
}
//删除
int Delete(Linklist *L,int x)
{
	int i = 1;
	Linklist *p,*q;
	p = L;
	if(L->next==NULL)
	{
		printf("单链表为空!\n");
		return 0;
	}
	while(p->next!=NULL&&i<x)
	{
		p = p->next;
		i++;
	}
	if(p->next==NULL)
	{
		printf("没有第%d个结点!\n",x);
		return 0;
	}
	else
	{
		q = p->next;
		p->next = p->next->next;
		free(q);
		return 1; 
	}
}
//查找
int  Seek(Linklist *L,ElemType x)
{
	Linklist *p,*q,*r;
	int i = 1;
	if(L->next==NULL)
	{
		printf("单链表为空!\n");
		return 0;
	}
	else
	{
		p = L->next;
		while(p!=NULL)
		{
			if(p->data!=x)
			{
				i++;
				p = p->next;
			}
			else break;
		}
		if(p==NULL)
		{
			printf("没有数值%d!\n",x);
			return 0;
		}
		else return i;
	}
}
//输出
void output(Linklist *L)
{
	Linklist *p;
	p = L->next;
	printf("输出单链表;\n");
	for(;p!=NULL;p=p->next)
	{
		printf("%d ",p->data);
	}
	printf("\n");
} 

int main()
{
	int n,i; 
	ElemType x,item;
    Linklist *L;
    printf("请输入单链表元素的个数:");
    scanf("%d",&n);
    L = CreateList(n);
    output(L);
    printf("插入的结点:");
	scanf("%d",&x);
	printf("插入的数值:");
	scanf("%d",&item); 
    Insert(L,item,x);
    output(L);
    printf("删除的结点:");
    scanf("%d",&x);
    Delete(L,x);
    output(L);
    printf("查找的数值:");
	scanf("%d",&x); 
    printf("%d的位置是: %d",x,Seek(L,x));
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

写bug如流水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值