链表的基本操作

链表的基本概念以及分配内存空间

 

1.创建链表

把每个结点的next指针指向下一个结点的地址即可。

程序代码:

#include<cstdio> 
//#include<stdlib>
struct node {
	int data;	//数据域 
	node* next;		//	指针域 
};

//创建链表
node* create(int Array[]) {
	node *p,*pre,*head;	//pre保存当前结点的前驱结点,head为头结点
	head = new node;	//创建头结点
	head->next = NULL;	//头结点不要数据域,指针域初始为NULL
	pre = head;		//记录pre为head
	for(int i=0;i<5;i++) {
		p = new node;		//新建结点
		//将Array[i]赋给新建的结点作为数据与域,也可以scanf输入 
		p->data = Array[i];
		p->next = NULL;		//	新建的结点指针域设为NULL 
		pre->next = p;		//前驱结点的指针域为当前新建的结点的地址(将链表连接起来) 
		pre = p; 	//把pre设为p,作为下一个结点的前驱结点 
	}
	return head;	//返回头指针 
}

int main(){
	int Array[5] = {5,3,6,1,2};
	node* L = create(Array); //新建链表,返回头指针head赋值给L
	L = L->next;//从第一个结点开始有数据域
	while(L!=NULL) {
		printf("%d",L->data);//输出每个结点的数据域
		L = L->next; 
	} 
	return 0;
}

 

运行结果:

 

 

2.查找元素

査找其中是否有给定的元素x,从第个结点开始,不断判断当前结点的数据域是否等于x,如果等于,那么就给计数器 count加1。这样当到达链表结尾时, count的值就是链表中元素x的个数。

程序代码 :

#include<cstdio> 
//#include<stdlib>
struct node {
	int data;	//数据域 
	node* next;		//	指针域 
};

//创建链表
node* create(int Array[]) {
	node *p,*pre,*head;	//pre保存当前结点的前驱结点,head为头结点
	head = new node;	//创建头结点
	head->next = NULL;	//头结点不要数据域,指针域初始为NULL
	pre = head;		//记录pre为head
	for(int i=0;i<5;i++) {
		p = new node;		//新建结点
		//将Array[i]赋给新建的结点作为数据与域,也可以scanf输入 
		p->data = Array[i];
		p->next = NULL;		//	新建的结点指针域设为NULL 
		pre->next = p;		//前驱结点的指针域为当前新建的结点的地址(将链表连接起来) 
		pre = p; 	//把pre设为p,作为下一个结点的前驱结点 
	}
	return head;	//返回头指针 
}

//在以head为头结点的链表上计数元素x的个数
int search(node* head, int x) {
	int count = 0;	//计数器
	node* p = head->next; 
	while(p != NULL) {
		if(p->data == x) {
			count++;
		}
		p = p->next;
	}
	return count;
}

int main(){
	int Array[5] = {5,2,2,1,2};
	node* L = create(Array); //新建链表,返回头指针head赋值给L
	L = L->next;//从第一个结点开始有数据域
	printf("%d",search(L,2)); 
	return 0;
}

 

运行结果:

 

3.插入元素

对链表来说,插入元素是指在链表给定位置的地方插入一个结点。例如在链表5→3→6→1→2的第3个位置插入元素4,就会使链表变为5→3→4→6→1→2。在第3个位置插入元素4的意思是指在插入完成之后第3个位置的元素就是4,通过插入过程中指针的变化可发现:

①元素4所在结点的指针域next指向了元素6所在结点的地址。

②元素3所在结点的指针域next指向了元素4所在结点的地址。

程序代码:

#include<cstdio> 
//#include<stdlib>
struct node {
	int data;	//数据域 
	node* next;		//	指针域 
};

//创建链表
node* create(int Array[]) {
	node *p,*pre,*head;	//pre保存当前结点的前驱结点,head为头结点
	head = new node;	//创建头结点
	head->next = NULL;	//头结点不要数据域,指针域初始为NULL
	pre = head;		//记录pre为head
	for(int i=0;i<5;i++) {
		p = new node;		//新建结点
		//将Array[i]赋给新建的结点作为数据与域,也可以scanf输入 
		p->data = Array[i];
		p->next = NULL;		//	新建的结点指针域设为NULL 
		pre->next = p;		//前驱结点的指针域为当前新建的结点的地址(将链表连接起来) 
		pre = p; 	//把pre设为p,作为下一个结点的前驱结点 
	}
	return head;	//返回头指针 
}

//将x插入以head为头结点的链表的pos个位置上
void insert(node* head,int pos,int x) {
	node* p = head;
	for(int i=1;i<pos-1;i++) {
		p = p->next;	//pos-1是为了到插入位置的前一个结点 
	}
	node* q = new node;	//新建结点
	q->data = x;	// 新结点的数据域为x
	q->next = p->next;		//新结点的指针域为当前结点的下一个结点
	p->next = q;		//前一个位置的结点指向新结点 
}


int main(){
	int Array[5] = {5,3,4,1,2};
	node* L = create(Array); //新建链表,返回头指针head赋值给L
	L = L->next;//从第一个结点开始有数据域
	insert(L,4,6);
	for(int i=0;i<6;i++) {
		printf("%d",L->data);
		L = L->next;
	} 
	
	return 0;
}

运行结果:

注意:

插入数据操作顺序必须是先把新结点的指针域next指向后继结点,之后才能把前一个元素指向新的结点地址,否则会因为链接断开导致后面的地址失效。

 

 

4.删除元素

对链表来说删除元素是指删除链表上所有值为给定数x。

删除操作是这样进行的:

①由指针变量p枚举结点,另一个指针变量pre表示p指向结点的前驱结点。

②当p所指结点的数据域恰好为x时,进行下面三个操作。

  • 令pre所指结点的指针域next指向p所指结点的下一个结点。
  • 释放p所指结点的内存空间。
  • 令p指向pre所指结点的下一个节点。

 

程序代码:

#include<cstdio> 
//#include<stdlib>
struct node {
	int data;	//数据域 
	node* next;		//	指针域 
};

//创建链表
node* create(int Array[]) {
	node *p,*pre,*head;	//pre保存当前结点的前驱结点,head为头结点
	head = new node;	//创建头结点
	head->next = NULL;	//头结点不要数据域,指针域初始为NULL
	pre = head;		//记录pre为head
	for(int i=0;i<5;i++) {
		p = new node;		//新建结点
		//将Array[i]赋给新建的结点作为数据与域,也可以scanf输入 
		p->data = Array[i];
		p->next = NULL;		//	新建的结点指针域设为NULL 
		pre->next = p;		//前驱结点的指针域为当前新建的结点的地址(将链表连接起来) 
		pre = p; 	//把pre设为p,作为下一个结点的前驱结点 
	}
	return head;	//返回头指针 
}

//删除以head为头结点的链表中所有数据域为x的结点
void del(node* head,int x) {
	node* p = head->next;	//p从第一个节点开始枚举
	node* pre = head;		//pre始终保存p的前驱结点的指针
	while(p != NULL) {
		if(p->data ==x){		//数据域恰好为x 
			pre->next = p->next;
			delete(p); 
			p=pre->next;
		}else {
			pre = p;
			p = p->next;
		}
	}
}
int main(){
	int Array[5] = {5,3,3,1,2};
	node* L = create(Array); //新建链表,返回头指针head赋值给L
	L = L->next;//从第一个结点开始有数据域
	del(L,3); 
	for(int i=0;i<3;i++) {
		printf("%d",L->data);
		L = L->next;
	} 
	
	return 0;
}

运行结果:

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页