目 录
一、创建链表节点
/*
struct node{
typename data; //数据域
node* next; //指针域
};
选择带头结点的链表
*/
struct node{
int x;
node* next;
}
二、创建链表
- (C语言)malloc与free:
/* 在头文件#include <stdlib.h>申请一个内容空间 typename* p=(typename*)malloc(sizeof(typename)); 但是malloc(sizeof(typename))返回的是未确定类型的指针void*,所以要加上装置类型转换(*typename) free(p) 释放空间 */ int* p=(int*)malloc(sizeof(int)); free(p); /* 如果失败,返回空指针NULL并赋值给p 如,int* p=(node*)malloc(100000000*sizeof(node*)); 可能会申请空间失败 */
- (C++)new与delete:
/* new是C++中用来申请动态空间的运算符 typename* p=new typename; delete(p);是与new一同使用的,方式内存泄露 */ node* p=new node; delete(p);
三、创建链表
node* create(int arr[]){
node *p,*pre,*head; //pre保存当前结点的前驱结点,head为头结点
node* head = new node;
head->next=null;
pre = head;
for(int i=0;i<arr.length();i++){ //创建链表五步走
node* p = new node; //第一步:申请一个内存空间
p->data = arr[i]; //第二步:将数据赋值给结点的数值域
p->next = null; //第三步:操作新结点的左边,将新结点p->next赋值为null
pre->next = p; //第四步:操作新结点的右边,将前驱结点的next指针指向p
pre=p; //第五步:把新结点设置为前驱结点
}
return head;
}
/*引用方式*/
node* L = create(arr); //arr是数组
L = L->next; //L因为第一个结点是空结点head,所以需要有数值域需要将指针后移
while(L!=NULL){
printf("%d",L->data);
L = L->next; //移动指针
}
四、查找元素
/*比如查找所要的数的个数*/
int search(node* head,int x){ //需要一个链表和查找的数
int count = 0; //计数器为0
node* p = head->next;
while(p!=null){
if(p->data==x){ //值相等,计数器+1
count++;
}
p->next; //指针向后挪一位
}
return count;
}
五、插入元素
/*比如插入一个数x*/
void search(node* head,int pos,int x){ //需要一个链表、插入的位置和插入的数
node* p = head;
for(int i=0;i<pos-1;i++){ //移动指针到需要插入位置的前一个位置
p->next;
}
node* q = new node; //申请一个新的结点
q->data = x;
q->next = p->next;
p->next = q;
}
六、删除元素
void delete(node* head,int x){ //需要一个链表和删除的数
node* p = head->next; //p从第一个点开始枚举
node* pre = head; //pre始终指向前一个结点,因为需要前一个结点的->next指向删除结点的后一个结点,p是pre的后一个结点,pre是p的前一个结点
while(p!=null){
if(p->data==x){ //找到要删除的元素了
pre->next = p->next; //删除结点的next指向的结点赋值给删除结点前一个结点的next
delete(p);
p=pre->next; //p指针后移一位
}else{ //若不是,两个指针后移
pre = p;
p = p->next;
}
}
}
七、静态链表
若结点数是较小的整数,可以采用静态链表。其实现的原理是hash,即通过建立一个结构体,并领数组的下标直接表示结点的地址,以达到直接访问数组中元素就能访问结点的效果,银外由于结点的访问非常方便,因此静态结点不需要头结点的。
struct Node{
int data; //数据类型随意
int next;
}node[size];
/*
如果初始结点的地址是11111,第二个结点的地址是22222,第三个节点是33333,且第三个结点为链表的末尾,那么,整个静态链表的结点就可以通过下面的写法实现
node[111111].next = 222222;
node[222222].next = 333333;
node[333333].next = -1;
*/