单链表的基本操作实现:初始化、尾插法、头插法、输出单链表、求表长、按序号查找、按值查找、插入结点、删除结点。

1.参考学习博文(写的相当好的文章):

http://t.csdnimg.cn/AipNl

2.关于我的总结:

定义单链表:

typedef struct LNode
{
	Elemtype data;
	struct LNode* next;
}LNode;

data用来存放元素值,next用来指向后继结点,

typedef是自定义结构体,单链表的结点类型为LNode

typedef struct LNode{//单链表的结构定义
    int data;//定义int类型的数据域
    struct LNode *next; //定义指针域
}LNode,*linklist;

这个地方会出现两个让人比较迷的东西:结构指针LNode和linklist。本质上而言,这两种类型是等价的。通常用linklist说明指针变量,强调它是某个单链表的头指针变量,定义为linklist L,L表示头指针。LNode用来定义单链表中结点的指针,例如LNode *p,p为结点的指针变量,p也可以定义为头结点。但是在方法的编写时,这两种定义会混合使用,非常容易迷惑我们的思维。我都只使用LNode来定义。

                                                                                                出处:http://t.csdnimg.cn/AipNl

 3.关于我的疑问:

按序号查找元素时,元素的值,用e返回,为什么e要用引用型变量&e

int Getelem_L(LNode* L, int i, int &e)

4.实战代码:

#define _CRT_SECURE_NO_WARNINGS
typedef int Elemtype;
#define ERROR -1
#include<stdio.h>
#include <iostream>
using namespace std;

//定义结构体储存俩个元素:data存放元素值,next指向后继节点。
typedef struct LNode
{
	Elemtype data;
	struct LNode* next;
}LNode;

//初始化单链表
void InitList(LNode* & L)
{
	L = new LNode;
	L->next = NULL;
}

//建立单链表
//头插法
//void CreateList_H(LNode*& L, int n)
//{
//	LNode* p;
//	for (int i = n; i > 0; --i)
//	{
//		p = new LNode;
//		cin >> p->data;
//		p->next = L->next;
//		L->next = p;
//	}
//}

//尾插法
void CreateList_R(LNode*& L, int n)
{
	LNode* r = L,*p;
	for (int i = 0; i < n; ++i)
	{
		p = new LNode;
		cin >> p->data;
		p->next = NULL;
		r->next = p;
		r = p;
	}
}

//输出单链表
void DispList(LNode* L)
{
	LNode* p = L->next;
	printf("打印单链表:\n");
	while (p != NULL)
	{
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
}

//求单链表的长度
int ListLength_L(LNode* L)
{
	int  i = 0;
	LNode* p;
	p = L->next;
	while (p) {
		i++;
		p = p->next;
	}
	return i;
}


//按序号查找单链表中的元素(从p=L->next依次扫描,j=1,p每次移动j加1,当j==i时,则找到)
int Getelem_L(LNode* L, int i, int &e)
{
	LNode *p = L->next;
	int j = 1;
	while (p && j < i)
	{
		p = p->next;
		++j;
	}
	if (!p || j > i)
		return ERROR;
	e = p->data;
	return e;
}

//按值查找(从第一个结点依次和e比较,找到返回位置或地址,未找到则返回0或NULL)
int LocateLem_L(LNode* L, int e)
{
	int i = 1;
	LNode* p = L->next;
	while (p && p->data != e)
	{
		p = p->next;
		i++;
	}
	if (p == NULL)
		return(0);
	else
	    return i;
}

//单链表的插入操作(在L中第i个元素之前插入e)
void ListInsert_L(LNode*& L, int i, int e)
{
	LNode* p = L;
	LNode* s;
	int j = 0;
	while (p && j < i - 1)  //查找到第i-1个元素
	{
		p = p->next;
		++j;
	}
	s = new LNode;   //创建新结点s,将data域置为e
	s->data = e;
	s->next = p->next;//将新结点插入结点p之后
	p->next = s;
}

//单链表的删除操作(找到p指向的a(i-1),保存ai,令p->next指向a(i+1),p->next=p->next->next,最后释放结点ai的空间)
void ListDelete_L(LNode*& L, int i, int& e)
{
	LNode* p = L;
	LNode* q;          //创建一个新结点q用来临时保存被删除的元素
	int j = 0;
	while (p->next && j < i - 1)  //查到第i-1个元素,p指向第i-1个元素
	{
		p = p->next;
		++j;
	}
	if (!(p->next) || j > i - 1)  //如果查不到第i-1个元素或者查的元素超过范围,则不进行接下来的操作
		return;
	q = p->next;      //q指向第i个元素
	p->next = q->next;   //p指向第i+1个元素
	e = q->data;      //e保存结点q的元素
	delete q;  //释放q的空间
	printf("删除的元素是:%d", e);
}


int main()
{
	LNode* L;
	//初始化单链表
	InitList(L);
	//尾插法
	printf("please input five numbers\n");
	CreateList_R(L, 5);
	printf("-----------------------------------\n");
	//输出单链表
	DispList(L);
	printf("-----------------------------------\n");
	//求表长
	printf("单链表的长度为:%d\n", ListLength_L(L));
	printf("-----------------------------------\n");
	//按序号查找单链表中的元素
	printf("你要查找的元素序列是:");
	int i,e;
	cin >> i;
	printf("\n");
	printf("要查找的元素是:%d\n",Getelem_L(L, i, e));
	printf("-----------------------------------\n");
	//按值查找
	printf("请输入要查找的值:");
	cin >> e;
	printf("\n");
	printf("该元素的位置是:%d\n", LocateLem_L(L, e));
	printf("-----------------------------------\n");
	//插入结点
	int a=0 , b=0;
	printf("请输入要插入的位置:");
	cin >> a;
	printf("请输入要插入元素的值:");
	cin >> b;
	ListInsert_L(L, a, b);
	printf("\n");
	DispList(L);//输出单链表
	printf("-----------------------------------\n");
	//删除元素
	printf("请输入要删除的元素位置:\n");
	int c = 0,d=0;
	cin >> c;
	ListDelete_L(L, c,d);
	printf("\n");
	DispList(L);//输出单链表
	printf("-----------------------------------\n");
return 0;
}

5.实战效果演示(已跑代码,准确运行)

猜你喜欢

转载自blog.csdn.net/2301_79355407/article/details/137940451