链表操作
1. 存储结构:
typedef struct node{
int data;
node* next;
}node,*Node;
2. 在当前链表中位置 i 插入一个结点:
- 图示:
- 步骤:
- 先找到第 i-1 位置结点 Pi-1
- 插入:Px->next = Pi-1->next,Pi-1->next = Px
示例代码:
Node insertInto(Node head,int i,int data){//插入一个结点 Node insertNode = new node; if(i == 1){ //当插入到第一个结点 insertNode->next = head; head->data = data; return insertNode; }else{ int len = 1; Node pre = head->next; while(pre){ if(len == i-1) //遍历链表,查找要插入的位置 break; pre = pre->next; len++; } if(len == i-1){ insertNode->data = data; insertNode->next = pre->next; pre->next = insertNode; }else{ cout<<"所要插入的位置大于了链表的长度!"<<endl; } return head; } }
3. 从当前链表中删除位置 i 结点:
- 图示:
- 步骤:
- 先找到第 i-1 位置结点 Pi-1
- 删除:i-1结点指向i+1结点即 Pi-1->next = Pi-1->next->next
- 示例代码:
Node deleteNode(Node head,int i){ //删除一个结点
Node insertNode = new node;
if(i == 1){ //当删除的结点是第一个结点时
head->next = head->next->next;
return head;
}else{
int len = 1;
Node pre = head->next;
while(pre){
if(len == i-1)
break;
pre = pre->next;
len++;
}
cout<<len<<endl;
if(len == i-1){
Node delNode = pre->next;
pre->next = pre->next->next;
free(delNode);
}else{
cout<<"所要删除节点的位置大于了链表的长度!"<<endl;
}
return head;
}
}
4. 整个程序示例代码:
#include <iostream>
#include <cstdlib>
using namespace std;
typedef struct node{
int data;
node* next;
}node,*Node;
Node create(int arr[]){
Node head,p,pre;//head表示头结点,pre表示每个结点的前驱
head = new node;//创建一个头结点
head->next = NULL;
pre = head;
for(int i = 0;i < 7;i++){
p = new node;
p->data = arr[i];
p->next = NULL;
pre->next = p;//前驱结点指向当前结点
pre = p;
}
return head;//返回头结点
}
Node insertInto(Node head,int i,int data){//插入一个结点
Node insertNode = new node;
if(i == 1){ //当插入到第一个结点
insertNode->next = head;
head->data = data;
return insertNode;
}else{
int len = 1;
Node pre = head->next;
while(pre){
if(len == i-1) //遍历链表,查找要插入的位置
break;
pre = pre->next;
len++;
}
if(len == i-1){
insertNode->data = data;
insertNode->next = pre->next;
pre->next = insertNode;
}else{
cout<<"所要插入的位置大于了链表的长度!"<<endl;
}
return head;
}
}
Node deleteNode(Node head,int i){ //删除一个结点
Node insertNode = new node;
if(i == 1){ //当删除的结点是第一个结点时
head->next = head->next->next;
return head;
}else{
int len = 1;
Node pre = head->next;
while(pre){
if(len == i-1)
break;
pre = pre->next;
len++;
}
cout<<len<<endl;
if(len == i-1){
Node delNode = pre->next;
pre->next = pre->next->next;
free(delNode);
}else{
cout<<"所要删除节点的位置大于了链表的长度!"<<endl;
}
return head;
}
}
int findNode(Node head,int data){ //寻找一个结点的位置
Node pre = head->next;
int len = 1;
while(pre){
if(pre->data == data){
return len;
}
pre = pre->next;
len++;
}
return -1;
}
int main(void){
int arr[] = {0,20,-1,5,56,97,10};
Node L = create(arr);
//L = insertInto(L,10,50);
/* L = deleteNode(L,4);
L = L->next;
while(L){
cout<<L->data<<" ";
L = L->next;
}
*/
int temp = findNode(L,10);
if(temp > 0){
cout<<"要查找的元素下标为:"<<temp<<endl;
}else{
cout<<"未找到!"<<endl;
}
return 0;
}