C语言实现单链表


前言

           近期学习了单链表的知识,对于书本上那些图画表示链表确实生动,但我也还是不怎么明白具体是如何操作,但研究书本上的代码加上各种资料的搜索,让我写下了单链表的操作代码。

           希望这篇博客对您有帮助和参考价值。同时也是为了记录一下自己的编程学习之路吧。新CSDBNER,不当之处,还望指正。


单链表的基本操作

     单链表的基本操作包括单链表的初始化、建立、插入、查找、修改、打印、表长的输出等等运算。其中比较重要的是按值查找元素、查找某位置并插入元素、修改某位置的元素以及尾插法建表。目前该表是只实现了这些操作,并进行的测试。

1.头文件准备(定义指针,数据)

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

typedef struct Node
{
	int data;
	struct Node* next;
}Node,*LinkList;

2.用尾插法建立单链表

LinkList CreateFormTail(LinkList L)
{
	L=(Node*)malloc(sizeof(Node));
	L->next=NULL;
	
	Node *r,*s;
	int x;
	scanf("%d",&x);
	r=L;
	while(x!=9999)
	{
			s=(Node*)malloc(sizeof(Node));
			s->data=x;
			r->next=s;
			r=s;
			scanf("%d",&x);
	}
	r->next=NULL;
	return L;
 }

3.在单链表中查找值为e的元素 

int Locate(LinkList L,int e) 
{
	Node *p;
	p=L->next;
	int i=1;
	while(p!=NULL&&p->data!=e)
	{
		p=p->next;
		i++;
	}
	if(p==NULL)
	    return 0;
	else
	    return i;
}

4.在链表中第i个位置插入值为e的元素

bool InsList(LinkList L,int i,int e)
{
	Node *pre,*s;
	int k=0;
	if(i<=0) return false;
	pre=L;
	while(pre!=NULL&&k<i-1)
	{
		pre=pre->next;
		k=k+1;
	}
	if(pre==NULL)
	    return false;
	s=(Node*)malloc(sizeof(Node));
	s->data=e;
	s->next=pre->next;
	pre->next=s;
	return true;
 }
 

6.删除第i个元素

bool DelList(LinkList L,int i,int e)
{
	Node *pre,*r;
	int k=0;
	pre=L;
	while(pre->next!=NULL&&k<i-1)
	{
		pre=pre->next;
		k=k+1;
	}
	if(pre->next==NULL)
	    return false;
	r=pre->next;
	pre->next=r->next;
	e=r->data;
	free(r);
	return true;
}

7.修改链表中第i个元素的数值

int ChangeList(LinkList L,int i,int e)
{
	Node *pr;
	pr=L;
	while(pr!=NULL)
	if(pr->data==i)
	{
		pr->data=e;
		break;
	}
	else
	{
		pr=pr->next;
	}
	if(pr==NULL) return false;
	return true;
 } 

8.求单链表的长度

int ListLength(LinkList L)
{
	Node *p;
	p=L->next;
	int j=0;
	while(p!=NULL)
	{
		p=p->next;
		j++;
	 }
	 return j;
 } 

9.打印输出单链表

void PrintList(LinkList L)
{
	L=L->next;
	while(L)
	{
		printf("%3d",L->data);
		L=L->next;
	 }
	 printf("\n");
 } 

10.主函数

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

typedef struct Node
{
	int data;
	struct Node* next;
}Node,*LinkList;


//用尾插法建立单链表
LinkList CreateFormTail(LinkList L)
{
	L=(Node*)malloc(sizeof(Node));
	L->next=NULL;
	
	Node *r,*s;
	int x;
	scanf("%d",&x);
	r=L;
	while(x!=9999)
	{
			s=(Node*)malloc(sizeof(Node));
			s->data=x;
			r->next=s;
			r=s;
			scanf("%d",&x);
	}
	r->next=NULL;
	return L;
 }


//在单链表中查找值为e的元素 
int Locate(LinkList L,int e) 
{
	Node *p;
	p=L->next;
	int i=1;
	while(p!=NULL&&p->data!=e)
	{
		p=p->next;
		i++;
	}
	if(p==NULL)
	    return 0;
	else
	    return i;
}

//在链表中第i个位置插入值为e的元素
bool InsList(LinkList L,int i,int e)
{
	Node *pre,*s;
	int k=0;
	if(i<=0) return false;
	pre=L;
	while(pre!=NULL&&k<i-1)
	{
		pre=pre->next;
		k=k+1;
	}
	if(pre==NULL)
	    return false;
	s=(Node*)malloc(sizeof(Node));
	s->data=e;
	s->next=pre->next;
	pre->next=s;
	return true;
 }
 
//删除第i个元素
bool DelList(LinkList L,int i,int e)
{
	Node *pre,*r;
	int k=0;
	pre=L;
	while(pre->next!=NULL&&k<i-1)
	{
		pre=pre->next;
		k=k+1;
	}
	if(pre->next==NULL)
	    return false;
	r=pre->next;
	pre->next=r->next;
	e=r->data;
	free(r);
	return true;
}

//修改链表中第i个元素的数值
int ChangeList(LinkList L,int i,int e)
{
	Node *pr;
	pr=L;
	while(pr!=NULL)
	if(pr->data==i)
	{
		pr->data=e;
		break;
	}
	else
	{
		pr=pr->next;
	}
	if(pr==NULL) return false;
	return true;
 } 

//求单链表的长度
int ListLength(LinkList L)
{
	Node *p;
	p=L->next;
	int j=0;
	while(p!=NULL)
	{
		p=p->next;
		j++;
	 }
	 return j;
 } 

//打印输出单链表
void PrintList(LinkList L)
{
	L=L->next;
	while(L)
	{
		printf("%3d",L->data);
		L=L->next;
	 }
	 printf("\n");
 } 

int main()
{
	LinkList list;
	int i,j,k,e;
	printf("请输入链表中的数值:"); 
	list=CreateFormTail(list);
	printf("当前链表中的数据为:");
	PrintList(list);
	printf("表长为:%d\n",ListLength(list));
	
	printf("请输入需要查找元素e的值:") ;
	scanf("%d",&e);
	printf("%d所在的位置是:%d\n",e,Locate(list,e));
	
	printf("请输入需要插入元素的位置i和元素的值e:");
	scanf("%d%d",&i,&e);
	InsList(list,i,e);
	printf("插入元素后链表中的数据为:");
	PrintList(list);
	printf("表长为:%d\n",ListLength(list));
	
	printf("请输入需要删除元素的位置i的值:");
	scanf("%d",&i);
	DelList(list,i,e);
	printf("删除元素后链表中的数据为:");
	PrintList(list);
	printf("表长为:%d\n",ListLength(list));
	
	printf("请输入需要修改位置i的值和更改后的值e:");
	scanf("%d%d",&i,&e);
	ChangeList(list,i,e);
	printf("修改元素后链表中的数据为:");
	PrintList(list);
	printf("表长为:%d\n",ListLength(list));
	
 } 

11.运行结果


总结

          该链表的功能还不够完善,后续会继续进行完善。

  • 34
    点赞
  • 178
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zero.zwt

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

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

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

打赏作者

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

抵扣说明:

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

余额充值