数据结构(二):线性表——单链表的定义与基本操作

目录

一、定义

二、初始化

三、头插法建立单链表

四、尾插法建立单链表

五、按序号查找结点值

六、插入操作

七、删除操作


一、定义

#define ElemType int
typedef struct LNode {  //带头结点的单链表
	ElemType 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(list &L)
{
	L = NULL;
	return true;
}

注:

  • 不带头节点的单链表的定义中,list 等同于LiskList , node 等同于 LNode

三、头插法建立单链表

(带头节点)

void List_HeadInsert(LinkList &L)
{
	ElemType x;
	LNode *s;
	cout << "请输入数据:";
	cin >> x;
	while(x!=9999)
	{
		s = (LNode *)malloc(sizeof(LNode));
		s->data = x;
		s->next = L->next;
		L->next = s;
		cin >> x;
	}
}

(不带头节点)

void list_HeadInsert(list &L)
{
	ElemType x;
	cout << "请输入数据:";
	cin >> x;
	while(x!=9999)
	{
		node *s;
		s = (node *)malloc(sizeof(node));
		s->data = x;
		s->next = L;
		L = s;
		cin >> x;
	}
}

四、尾插法建立单链表

(带头节点)

void List_TailInsert(LinkList &L)
{
	ElemType x;
	LNode *s, *r = L;
	cout << "请输入数据:";
	cin >> x;
	while(x!=9999)  
	{
		s = (LNode *)malloc(sizeof(LNode));
		s->data = x;
		r->next = s;
		r = s;
		cin >> x;
	}
	r->next = NULL;
}

(不带头结点)

void list_TailInsert(list &L)
{
	ElemType x;
	node *r = L;
	cout << "请输入数据:";
	cin >> x;
	while(x!=9999)
	{
		node *s = (node *)malloc(sizeof(node));
		s->data = x;
		s->next = NULL;
		if(L==NULL)
		{
			L = s;
			r = L;
		}
		else
		{
			r->next = s;
			r = s;
		}
		cin >> x;
	}
}

五、按序号查找结点值

(带头节点)——GetElem()

LNode* GetElem(LinkList L, int i)
{
	int j = 1;
	LNode* p = L->next;
	if (i == 0) //如果 i=0, 返回头结点
		return L;
	if (i < 1) //如果 i 无效,返回NULL
		return NULL;
	while (p && j < i)
	{
		p = p->next;
		j++;
	}
	return p; //返回第 i 个节点的指针,若 i 大于表长,则返回NULL
}

六、插入操作

已知待插入的结点 s ,插入的位置为 i ,则插入操作为


p = GetElem(L, i - 1); //查找插入位置的前驱节点
s->next = p->next;
p->next = s;


注:

  • 若无法得到 s 的前驱节点,只能得到 s 的后继结点 p,插入的思想为:仍将 s 插入到 p 之后,然后将二者的data信息互换。

七、删除操作

将单链表第 i 个结点删除 ,则删除操作为


p = GetElem(L, i - 1); //查找删除位置的前驱节点
q = p->next;
p->next = q->next;
free(q);


注:

  • 若无法得到第 i 个结点的前驱节点,只是知道了它本身,则删除的基本思想为:仍将它本身看为是一个前驱节点,让它本身的 data 等于后面的结点的 data,然后删除它本身后面的结点。
     

猜你喜欢

转载自blog.csdn.net/qq_45832961/article/details/124364797