链表(Linked List)
单链表的操作:
1、查找第i个元素;
2、删除第i个元素;
3、在位置i插入一个元素。
代码:
#include<iostream> using namespace std; #define ERROR -1 #define OK 1 struct Node { int data; Node *next; }; typedef int status; Node *head;//创建一个全局的头指针 void Create(){ Node *p;//节点指针 Node *q;//链尾指针 p = new Node; cin>>p->data; head = NULL; q = p; while(p->data !=0){ if(head == NULL){ head = p;//如果是第一次进入循环 //,那么把链表的头指针指向第一次动态开辟的堆内存地址 } else{ q->next = p;//如果不是第一次进入 //那么就把上一次的链尾指针的le->next指向上一次循环结束前动态创建的堆内存地址 } q = p;//设置链尾指针为当前循环中的节点指针,用于下一次进入循环的时候把上一次 //的节点的next指向上一次循环结束前动态创建的堆内存地址 p = new Node;//为下一个节点在堆内存中动态开辟空间 cin>>p->data; } q->next =NULL;//把链尾指针的next设置为空 delete p; //清除最后开辟的无效内存空间 } void display(){ Node *p =head; while(p){ cout<<p->data<<" "; p=p->next; } cout<<endl; } status find(Node&L,int i){ Node *p; p =head; int j=1; while(p && j<i){ p=p->next; ++j; } if(!p||j>i) return ERROR; return p->data; } status del(int i){ Node *p, *q; p = head;int j=1; while(p->next && j<i-1){ p=p->next; ++j; } if(!(p->next)||j>i-1)return ERROR; q = p->next; p->next = q->next; delete q; return OK; } status insert(int i, int e){ Node *p; p = head; int j=1; while(p&&j<i){p =p->next; ++j;} if(!p||j>i) return ERROR; Node *q; q =new Node; q->data =e; q->next = p->next; p->next =q; return OK; } int main() { Create(); display(); int i; cout<<"请输入要删除的节点编号:"; cin>>i; del(i); display(); int t, j; cout<<"要插入的位置和元素:"; cin>>t>>j; insert(t,j); display(); return 0; }
双向链表
待续 (^+^)