单链表的相关操作

按位序插入(带头结点)

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

typedef struct LNode {//一个结点带一个数据域和一个指针
	int data ;
	struct LNode *next;
}LNode,*LinkList;
//在第i个位置插入元素e
bool ListInsert(LinkList& L, int i, int e) {
	if (i < 1) {
		return false;
	}
	LNode* P;
	int j = 0;//表示现在在哪个结点
	P = L; //P指向链表的头结点
	while (P != NULL && j < i - 1) {		//找到要插入结点的前一个结点
		P = P->next;               //往后找
		j++;

		if (P == NULL) {
			return false;    //如果找不到 i值不合法
		}
		//找到了第i-1个结点
		LNode* s = (LNode*)malloc(sizeof(LNode));//开辟一个新的空间(此空间为LNode类型,带有数据域和指针)
		s->data = e;//将需要插入的e放入数据域中
		s->next = P->next; //s的next指针指向此时P得next所指向的数据域
		P->next = s;
		return true;
	}

按位序插入(不带头结点)

struct LNode
{
	struct LNode* next;
	int data;

};

bool InsertList(LNode* &L,int i,int e) {

	if (i == 1) {  //若要在头结点处插入数据
		LNode* s = (LNode*)malloc(sizeof(LNode));
		s->data = e;
		s->next = L;
		L = s ;           //头结点指向新结点
	}
	LNode* p;
	int j = 0;
	while (p != NULL && j < 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->next = s;
	return true;
}

指定结点的前插操作


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

struct LNode
{
	int data;
	LNode* next;
};
//法1:
bool InsertPriorNode(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;
}

//法2:
bool InsertPriorNode2(LNode* p, LNode* s) {
	if (p == NULL || s == NULL) {
		return false;
	}
	s->next = p->next;
	p->next = s;
	int temp=p->data;
	p->data = s->data;
	s->data = temp;
	return true;
}

}

按位序删除

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

struct LNode
{
	int data;
	LNode* next;

};
//带头指针
bool Delete(struct LNode*& L, int i, int &e) {//要把数据带回所以用引用
	if (i < 1) {
		return false;
	}
	LNode* p;
	p = L;
	int j = 0;

	while (p != NULL && j < i-1) {  //找到前驱结点
		p = p->next;
		j++;
	}
	if (p == NULL) {
		return false;  //如果找不到
	}
	LNode* q = p->next;  //找个指针指向要删除的元素
	e = q->data;
	p->next = q->next;
	free(q);
	return true;

}


//不带头指针
bool Delete1(struct LNode*& L, int i, int& e) {
	if (i < 1) {
		return false;
	}
	//如果删除第一个元素
	LNode* p = L;
	int j = 0;
	if (i == 1) {
	
		LNode* s = p;
		s->data = e;
		p = p->next;
		L = p;
		free(s);
	}


	while (p != NULL && j < i - 1) {  //找到前驱结点
		p = p->next;
		j++;
	}
	if (p == NULL) {
		return false;  //如果找不到
	}

	LNode* q = p->next;  //找个指针指向要删除的元素
	e = q->data;
	p->next = q->next;
	free(q);
	return true;
}

删除指定位置结点

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

struct LNode
{

	int data;
	LNode* next;

};

bool Delete(LNode* p) {
	if (p == NULL) {
		return false;
	}
	LNode* q = p->next;
	p->data = q->data;
	p->next = q->next;
	free(q);
	return true;
}


上一篇:数据结构第九节


下一篇:考研数据结构:(五)循环单链表的基本操作(L指向表头)的基本操作(只有干货)