0
点赞
收藏
分享

微信扫一扫

数据结构单链表实现(C语言)

booksmg2014 2022-04-04 阅读 38
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode {
	int data;
	struct LNode *next;
} LNode , *LinkList;

//初始化一个带头结点的单链表
bool InitList(LinkList L) {
	L = (LNode *)malloc(sizeof(LNode));
	if (L == NULL)
		return false;								//内存没分配成功
	L->next = NULL;
	return true;
}

//初始化一个不带头节点的单链表
/*bool InitList(LinkList L)
{
	L = NULL;
	return true
 } */

//按位序插入节点
bool ListInsert(LinkList L , int i , int e) {
	if (i<1)
		return false;
	LNode *s = L;
	s = L;									//为什么要定义一个指针变量s并把L的地址赋给s
	int j = 0;
	LNode *p = (LNode*)malloc(sizeof(LNode));
	if (p == NULL)
		return false;
	while (s!=NULL && j<i-1) {
		s = s->next  ;
		j ++;
	}
	p->next = s->next ;
	s->next = p;
	p->data = e;
	return true;
}

//不带头结点   按位序插入节点特例为第一个位置
/*bool InsertList(LinkList l,int i,int e) 
{
	if (i == 1)
		LNode *s = (LNode *)malloc(sizeof(LNode));
	s->next = L;
	s->data = e;
	L = s;								//此时s已经为链表第一个元素,l=s 为l等于链表第一个元素的地址 
}*/

//指定节点后插
bool InsertNextNode(LNode *p,int e)
{
	if (p == NULL)
	return false;
	LNode *s = (LNode*)malloc(sizeof(LNode));
	if (s == NULL)
	return false;
	s->next = p->next ;
	s->data = e;
	p->next = s;
	return true;
 }
 
//指定节点前插
bool InesrtPriorNode(LNode *p,int e)
{
	if (p == NULL)
	return false;
	LNode *s = (LNode*)malloc(sizeof(LNode));
	if (s == NULL)
	return false;
	s->next = p->next ;
	p->next = s;
	s->data = p->data ;
	p->data = e;
	return true;
 } 
 
 //按位序删除
bool ListDelete(LinkList L , int i , int *e)
{
	if (i<1)
	return false;
	//找位序第i-1个节点
	int j =0;
	LNode *p;
	p = L;
	while(p!=NULL&j<i-1)
	{
		p = p->next ;
		j++;
	 } 
	LNode *q;
	q = p->next ;					//q为p的下一个节点 
	*e = q->data ;
	p->next = q->next ;
	free (q);
	return true;
}

//指定节点删除
bool DeleteNode(LNode *p)
{
	LNode *q = +p->next ;
	p->data = q->data ;							//q为p的下一个节点 p的data等于q p的next=q相当去p的下一个节点把p覆盖了 
	p->next = q->next ;
	free(q);
	return true;
}

//按位查找
LNode *GetElem(LinkList L,int i)
{
	if (i<0)
	return NULL;
	int j = 0;
	LNode *p;
	p = L;
	while(p!=NULL&&j<i)
{
	p=p->next ;
	j++;
}
return p;
 } 
 
 //按值查找
LNode *LocateElem(LinkList L,int e) 
{
	LNode *p = L;
	while(p != NULL && p->data != e)
	p = p->next;
	return p;
}

//头插法建立单链表
LinkList List_HeadInesrt(LinkList L)
{
	LNode *p ;
	int x;
	scanf("请输入插入的数;%d",x);
	while(x!=496685)							//数为任意 输入这个数停止建立单链表 
	{
		p = (LNode *)malloc(sizeof(LNode));
		p->next = L->next ;
		L->next = p;
		p->data = x;
		scanf("请输入插入的数%d",x);
	}
	return L;
 } 
 
//尾插法建立一个单链表
LinkList List_LowInsert(LinkList L)
{
	LNode *p,*r=L;					//*r永远指向单链表最后一个节点 
	r = L;
	int x;
	scanf("请输入插入的数:%d",x); 
	while(x!=4613486) 
	{
		p = (LNode*)malloc(sizeof(LNode));
		r->next = p;							//r为头下一个h指向s就接起来了 
		r = p;									//r指向表尾 
		p->data = x;
		scanf("请输入插入的数:%d",x);
	}
	r->next = NULL;									//建立完成 把r next置空 
	return L; 
 } 
 
//表长
int Length(LinkList L)
{
	int len = 0;
	LNode *p;
	p = L;
	while(p->next !=NULL)
	{
		p = p->next ;
		len++;
	}
	return len;
 } 
int main() 
{
	int i,e;
	LNode a;
	LinkList L;
	InitList(L);
	ListInsert(L,i,e);
	InsertNextNode(&a,e);
	InesrtPriorNode(&a,e);
	ListDelete(L,i,&e); 
	DeleteNode(&a);
	GetElem(L,i);
	LocateElem(L,e);
	List_HeadInesrt(L);
	List_LowInsert(L);
	Length(L);
	return 0;
}
举报

相关推荐

0 条评论