用c语言实现单链表的基本操作

**

**
***备注:***自己刚学习数据结构,用来记录自己的学习之旅途,用于复习,一开始学的时候很是不能理解,但 现在有了一定的理解,在此代码中一定要理解各个模块的核心操作 以及注意在打印中的一个小问题。

所学习书籍为《数据结构–用c语言描述》(第2版)

//单链表的操作

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

typedef struct node
{
	char data;  //数据域
	struct node *next;   //指针域
}node;

void initlist(node *l)       //初始化单链表指针域为空
{
	l->next=NULL;
}

void lengthlist(node *l)
{
	int length=0;
	node *p=l;
	while(p!=NULL)
	{
		p=p->next;
		length++;
	}
	printf("该单链表的长度为:%d\n",length);
}

void createhead(node *l)			//头插法建表
{
	node *p=l,*s;
	int flag=1;
	char c;
	while(flag)
	{
		if((c=getchar())!='$')
		{
			s=(node*)malloc(sizeof(node));
			s->data=c;
			s->next=p->next;
			p->next=s;

		}
		else
		{
			flag=0;
		}
	}
}

void createtail(node *l)
{
	node *s,*r;                              //设置一个尾指针,使得其始终指向尾指针
	int flag=1;
	char c;
	r=l;
	while(flag)
	{
		if((c=getchar())!='$')
		{
			s=(node*)malloc(sizeof(node));
			s->data=c;
			r->next=s;
			r=s;
		}
		else
		{
			flag=0;
			r->next=NULL;
		}
	}
}

node *get(node *l,char x)                //判断该元素是否在单链表中
{
	node *p;
	p=l->next;
	while(p!=NULL)
	{
		if(p->data==x)
		{
		printf("找到了该元素\n");
		return p;
		}
		p=p->next;
	}
	printf("该元素不在单链表中\n");
	return NULL;

}

node *locate(node *l,int n)          //查找单链表中特定位置的元素的值
{
	node *p;
	int k=0;
	p=l->next;
	while(p!=NULL&&(k<n-1))
	{
		p=p->next;
		k++;
	}
	if(k==n)
	{
		printf("第%d个位置的元素为:%c",n,p->data);
		return p;
	
	}
	else
	{
		printf("查找位置不合法\n");
		return NULL;
	}
}

int insertlist(node *l,int n,char x)     // 在特定的位置插入特定的数值
{
	node *p=l->next,*s;
	int k=0;
	while(p!=NULL&&(k<n-1))
	{
		p=p->next;
		k++;
	}
	if(p==NULL)
	{
		printf("插入位置不合法\n");
		return 0;	
	}
	s=(node*)malloc(sizeof(node));
	s->data=x;
	s->next=p->next;
	p->next=s;
	return 1;
}

int dellist(node *l,int n)                //删除指定位置的元素
{
	node *p=l,*r;
	int k=0;
	while(p!=NULL&&(k<n-1))
	{
		p=p->next;
		k++;
	}
	if(p==NULL)
	{
		printf("删除位置不合法\n");
		return 0;
	}
	r=p->next;
	p->next=r->next;
	free(r);
	return 1;
}

void print(node *l)                //打印该单链表  一定要注意打印表的问题,在这的p=l->next ,先打印再加加  否则会导致后面的无法正常运行
{
	node *p=l->next;
	while(p!=NULL)
	{
		printf("%c ",p->data);
		p=p->next;
	
	}
	printf("\n");

}

void main()
{
	node *s=(node*)malloc(sizeof(node));
	initlist(s);
	createhead(s);  //createtail(s);
	print(s);
	lengthlist(s);
 	get(s,'k');
	locate(s,5);
	insertlist(s,5,'p');
	print(s);
	insertlist(s,200,'a');
	dellist(s,4);
	print(s);
	dellist(s,300);


}


















 



















































    





































































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值