链表

链表定义

struct node{
	typename data;
	node* next;
};
使用malloc函数或new运算符为链表结点分配内存空间
1、malloc函数

基本用法:

typename* p=(typename*)malloc(sizeof(typename));
//以申请一个int型变量和一个node型结构体变量为例
int* p=(int*)malloc(sizeof(int));
node* p=(node*)malloc(sizeof(node)); 
2、new运算符

基本用法:

typename* p=new typename;
//申请一个int型变量和node型结构体变量为例
int* p=new int;
node* p=new node; 
3、内存泄漏

注:释放malloc和new空间
1、free函数【对应malloc函数】

#include<stdlib.h>
free(p);

2、delete运算符

delete(p);

链表的基本操作

1、创建链表
//直观写法 
node* node1=new node;
node* node2=new node;
node* node3=new node;
node* node4=new node;

node1->data=5;
node1->next=node2;
node2->data=3;
node2->next=node3;
node3->data=6;
node3->next=node4;
node4->data=1;
node4->next=node5;
node5->data=2;
node5->next=NULL;

//使用for循环链表

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

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、查找元素
//在以head为头结点的链表上计数元素x的个数
int search(node* head,int x){
	int count=0;  //计数器 
	node* p=head->next; //从第一个结点开始 
	while(p!=NULL){  //只要没到链表末尾 
		if(p->data==x){
			count++;  //当前结点数据域为x,则count++ 
		}
		p=p->next;  //指针移动到下一个结点 
	}
	return count; //返回计数器count 
} 
3、插入元素
//将x插入以head为头结点的链表的第pos个位置上
void insert(node* head,int pos,int x){
	node* p=head;
	for(int i=0;i<pos-1;i++){
		p=p->next;  //pos-1是为了到插入位置的前一个结点 
	}
	node* q=new node;  //新建结点 
	q->data =x;  //新结点数据域为x 
	q->next=p->next;  //新结点的下一个结点指向原先插入位置的结点 
	p->next=q;  //前一个位置的结点指向新结点 
} 
4、删除元素
//删除以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{  //数据域不是x,把pre和p都后移一位 
			pre=p;
			p=p->next;
		}
	} 
} 

静态链表

静态链表结点定义
struct Node{
	typename data;
	int next;
}node[size]; 

注:在使用静态链表的时候,尽量不要把结构体类型名和结构体变量名取成相同的名字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值