#include<bits/stdc++.h>
using namespace std;
/*定义结点数据结构 typedef定义了一个结构体类型LNode,
它包含一个整型成员data和一个指向LNode结构体类型的指针成员next。
然后通过typedef关键字定义了LNode类型的别名LinkList,
这个别名表示指向LNode结构体类型的指针。*/
typedef struct LNode{
int data; //数据域
struct LNode *next;//指针域
}LNode,*LinkList;
//初始化
int InitLinkList(LinkList &head){
head=new LNode;
if(head==NULL){
return -1;
}
head->next=NULL;
return 0;
}
//销毁
void DestoryLinkList(LinkList &head){
head->next=NULL;
}
//尾插法 ,插入顺序和输出顺序是一样的;这里通过自定义的数组来建立单链表,也可以改成直接输入建立;
void CreatLinkListRear(LinkList &head,int A[],int n){
LinkList rear=head;
for(int i=0;i<n;i++){
LinkList p=new LNode;
p->data=A[i];
rear->next=p;
rear=p;
rear->next=NULL;
}
}
//头插法,倒序;
void CreatLinkListFront(LinkList &head,int A[],int n){
for(int i=0;i<n;i++){
LinkList p=new LNode;
p->data=A[i];
p->next=head->next;
head->next=p;
}
}
//插入,使用后插法.
/*前插法类似, 利用尾插法就可以实现逻辑上的前插法
例如:要在第5个位置插入e,就需要找到第5个结点,在第5个节点,后面插入一个值为e的结点,
再交换第5个结点和它后面一个结点的data值就可以了*/
void LinkListInsert(LinkList &head,int n,int e){
LinkList p=new LNode;
p->data=e;
LinkList q=head;
for(int i=1;i<n;i++){
q=q->next;
}
p->next=q->next;
q->next=p;
}
//删除 ,删除第n个元素
void LinkListDelete(LinkList &head,int n){
LinkList p=head;
LinkList q;
for(int i=1;i<n;i++){
p=p->next;
}
q=p->next;
delete q;
p->next=p->next->next;
}
//删除,删除第n个元素并返回其值;
int LinkListDeletePlus(LinkList &head,int n){
LinkList p=head;
for(int i=1;i<n;i++){
p=p->next;
}
LinkList q=p->next;
p->next=p->next->next;
int temp=q->data;
delete q;
return temp;
}
//修改, 修改第n个结点的值为e ;查找操作和修改类似,只是查找找到了没有修改,而是直接返回
void LinkListChange(LinkList &head,int n,int e){
LinkList p=head;
for(int i=1;i<=n;i++){
p=p->next;
}
p->data=e;
}
//主函数主要用于打印结果用,写的很乱,仅供参考
int main(){
int A[10]={1,2,3,4,5,6,7,8,9,10};
LinkList head;
InitLinkList(head);
CreatLinkListRear(head,A,10);//尾插法使用
//CreatLinkListFront(head,A,10)头插法使用
LinkList q1=head->next;
LinkList q2=head->next;
LinkList q3=head->next;
LinkList q4=head->next;
//输出结果验证一下
cout<<"尾插法:";
for(int i=0;i<10;i++){
cout<<q1->data;
q1=q1->next;
}
cout<<endl<<"在第5个位置插入0:";
LinkListInsert(head,5,0);
for(int i=0;i<11;i++){
cout<<q2->data;
q2=q2->next;
}
cout<<endl<<"删除第5个位置的结点并返回删除的值:";
cout<<LinkListDeletePlus(head,5)<<endl<<"链表为:";
for(int i=0;i<10;i++){
cout<<q3->data;
q3=q3->next;
}
cout<<endl<<"第5个位置的结点值改为99:";
LinkListChange(head,5,99);
for(int i=0;i<10;i++){
cout<<q4->data;
q4=q4->next;
}
return 0;
}