带头结点的单链表

1、节点类型

typedef struct LNode{	// 单链表的节点类型 
	int data;			// 数据域 
	struct LNode *next;	// 指针域 
}LNode,*LinkList;

2、初始化

// 单链表初始化 (带头结点) 
bool InitList(LinkList &L){
	L = (LNode*) malloc(sizeof(LNode));		// 分配一个头结点 
	L->next == NULL;		// 头结点暂时还没有结点 
	return true;
} 

3、判断链表是否为空

// 判断单链表为否为空
bool IsEmpty(LinkList L){
	if(L->next == NULL){
		return true;
	}else{
		return false;
	}
}

4、插入元素

// 在第 i 个位置插入元素 e (带头结点) 
bool LinkInsert(LinkList &L,int i ,int e){
	if(i<1){
		return false;
	}
	LNode *p;	// 指针 p 指向前面当前扫描到的结点
	int j = 0;	// 当前 p 指向的是第几个结点
	p = L;		// L 指向头结点,头结点是第0个结点(不存数据)
	while(p != NULL &&j<i-1){	// 循环找到第 i-1 个结点
		p = p->next;
		j++;
	} 
	if(p == NULL){
		return false;
	}
	LNode *s = (LNode *) malloc(sizeof(LNode));	//开辟一个新结点存放新插入的元素
	s->data = e; 		// 将数据存放在 数据域 
	s->next = p->next;	// 断开指针,将新插入的指针域指向p的下一个指针 
	p->next = s;		// 连接 
	return true;
}

5、删除元素

//  删除L中第i个位置的元素,并用e返回删除的元素 (带头结点)
bool LinkDelete(LinkList &L,int i,int &e){
	if(i<1){
		return false;
	}
	LNode *p;
	int j=0;
	p = L;
	while(p!=NULL && j<i-1){	// 循环找到第 i-1 个位置 
		p = p->next;
		j++;	
	} 
	if(p == NULL){
		return false;
	} 
	LNode *q = p->next;	// 令 p 指向被删除的结点;
	e = q->data;		// 用 e 将删除的数据返回 
	p->next = q->next;	// 将 q 结点从链中断开 
	free(q); 			// 释放结点的存储空间
	return true; 
}  

6、打印输出函数

// 打印输出 
int toString(LinkList L){
	LinkList p;
	p = L->next;
	while(p != NULL){
		printf("%d ",p->data);
		p = p->next;
	}
	return 1;
}

剩余操作省略

直接上代码全部代码

#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));		// 分配一个头结点 
	L->next == NULL;		// 头结点暂时还没有结点 
	return true;
} 

// 判断单链表为否为空
bool IsEmpty(LinkList L){
	if(L->next == NULL){
		return true;
	}else{
		return false;
	}
} 

// 在第 i 个位置插入元素 e (带头结点) 
bool LinkInsert(LinkList &L,int i ,int e){
	if(i<1){
		return false;
	}
	LNode *p;	// 指针 p 指向前面当前扫描到的结点
	int j = 0;	// 当前 p 指向的是第几个结点
	p = L;		// L 指向头结点,头结点是第0个结点(不存数据)
	while(p != NULL &&j<i-1){	// 循环找到第 i-1 个结点
		p = p->next;
		j++;
	} 
	if(p == NULL){
		return false;
	}
	LNode *s = (LNode *) malloc(sizeof(LNode));	//开辟一个新结点存放新插入的元素
	s->data = e; 		// 将数据存放在 数据域 
	s->next = p->next;	// 断开指针,将新插入的指针域指向p的下一个指针 
	p->next = s;		// 连接 
	return true;
}

// 前插操作-在 p 结点之前插入元素 e
bool InsertPriorNode(LNode *p,int e){
	if(p==NULL){
		return false;
	}
	LNode *s = (LNode *) malloc(sizeof(LNode));
	s->next = p->next;	//  
	p->next = s;		// 先将链表连接好
	s->data = p->data;	// 将原来的p结点的数据复制到s结点 
	p->data = e;		// 将原来的p结点的数据换成 e  (偷梁换柱) 
	return true; 
} 

//  删除L中第i个位置的元素,并用e返回删除的元素 (带头结点)
bool LinkDelete(LinkList &L,int i,int &e){
	if(i<1){
		return false;
	}
	LNode *p;
	int j=0;
	p = L;
	while(p!=NULL && j<i-1){	// 循环找到第 i-1 个位置 
		p = p->next;
		j++;	
	} 
	if(p == NULL){
		return false;
	} 
	LNode *q = p->next;	// 令 p 指向被删除的结点;
	e = q->data;		// 用 e 将删除的数据返回 
	p->next = q->next;	// 将 q 结点从链中断开 
	free(q); 			// 释放结点的存储空间
	return true; 
}  

// 按位查找, 返回第 i个结点 (带头结点)
LNode *GetElem(LinkList L,int i){
	if(i<0){	// 头结点可以看作第0个结点 
		return NULL; 
	}
	LNode *p;
	p = L;
	int j = 0;
	while(p!=NULL && j<i){	// 循环找到第i个结点 
		p = p->next;
		j++;
	}
	return p;	// 找到后返回该结点指针,否则返回NULL 
}

// 按值查找 - 找到数据域 == e 的结点 
LNode *LocalELem(LinkList L,int e){
	LNode *p;
	p = L->next;	// p结点指向头结点的下一个结点
	while(p != NULL && p->data != e){
		p = p->next;
	} 
	return p;	// 找到后返回该结点指针,否则返回NULL 
} 


// 求单链表的长度
int length(LinkList L){
	int len = 0;	// 统计表长 
	LNode *p = L;
	while(p->next != NULL){
		p = p->next;
		len++;
	}
	return len;
} 

// 单链表的建立--尾插法
LinkList List_TailInsert(LinkList &L){
	int x;
	L = (LNode *) malloc(sizeof(LNode));
	L->next = NULL;		// 初始化操作 ,建立头指针
	LNode *s,*r = L;		// r 表示表尾指针
	scanf("%d",&x);
	while(x!=-1){		// 输入的 x = -1 时结束 
		s = (LNode *) malloc(sizeof(LNode));	// 开辟新的空间
		s->data = x;
		r->next = s;
		r = s;		// r 指向新的表尾结点
		scanf("%d",&x); 
	}
	r->next = NULL;
	return L; 
} 

// 单链表的建立--头插法 
LinkList List_HeadInsert(LinkList &L){
	LNode *s;
	int x;
	scanf("%d",&x);
	L = (LNode *) malloc(sizeof(LNode));
	L->next = NULL;		// 初始化操作 ,建立头指针
	while(x!=-1){
		s = (LNode *) malloc(sizeof(LNode));
		s->data = x;
		s->next = L->next;
		L->next = s;
		scanf("%d",&x);
	}
	return L;
}

// 打印输出 
int toString(LinkList L){
	LinkList p;
	p = L->next;
	while(p != NULL){
		printf("%d ",p->data);
		p = p->next;
	}
	return 1;
}

int main()
{
	LinkList L;
	
	// 头插法 
	// List_HeadInsert(L);
	
	// 尾插法
	List_TailInsert(L); 
	int len = 0;
	len = length(L);
	printf("链表长度:%d\n",len);	
	toString(L);
	
	// 链表删除
	int e = -1;
	LinkDelete(L,4,e);
	printf("删除的元素是 e = %d\n",e);
	toString(L);
	 
	
	return 0;
	
}

测试运行:

56
58
52
52
10
454
-1
删除前链表长度:6
56 58 52 52 10 454 删除第4个元素是 e = 52
删除后链表长度:5
56 58 52 10 454
--------------------------------
Process exited after 5.7 seconds with return value 0
请按任意键继续. . .

 

 

 

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

XUN~MLF

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

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

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

打赏作者

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

抵扣说明:

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

余额充值