链表定义
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];