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

 

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;
}

 

运行结果:

链表的基本操作_链表_02

 

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;
}

运行结果:

链表的基本操作_链表_03

注意:

插入数据操作顺序必须是先把新结点的指针域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;
}

运行结果:

链表的基本操作_链表_04