数据结构 DLUT 链表
普通链表
#include<iostream>
using namespace std;
typedef struct List {
int data;
List* next;
}Lnode,*LinkList;
void InitList(LinkList &L){
L->next=NULL;
L->data=0;
}//初始化链表
void CreatListHead(LinkList &L) {
int n;
cout<<"输入要创建的链表节点数:"<<endl;
cin>>n;
L->data=n;
Lnode *p=NULL;
while(n--){
p=new Lnode;
cout<<"请输入数据:"<<endl;
cin>>p->data;
p->next=L->next;
L->next=p;
}
}//头插法
void CreatListTail(LinkList &L){
int n;
cout<<"输入要创建的链表节点数:"<<endl;
cin>>n;
L->data=n;
Lnode *p=L->next,*q=NULL;
while(n--){
cout<<"请输入数据:"<<endl;
cin>>p->data;
q=p;
p=new Lnode;
q->next=p;
}
}//尾插法
void TravalList(LinkList head) {
Lnode *L = head->next;
while (L) {
cout << L->data << endl;
L=L->next;
}
cout<<endl;
}
int ListLength(LinkList L){
return L->data;
// Lnode *p=&L;
// int n=0;
// for(;p->next!=NULL;){
// n++;
// p=p->next;
// }
// return n;
}//链表长度
bool ListEmpty(LinkList L){
if(L->next==NULL){
return true;
}
return false;
}//判断是否为空
void DestroyList(LinkList L){
Lnode *p;
while(p){
p=L;
L=L->next;
delete p;
}
}//销毁链表
void ClearList(Lnode &L){
Lnode *p,*q;
p=L.next;
while(p){
q=p->next;
delete p;
p=q;
}
L.next=NULL;
}//清空链表
int GetData(LinkList L,int i){
if(ListLength(L)<i||i<=0){
cout<<"越界错误"<<endl;
return -1;
}
Lnode *p=L;
for(int j=0;j<i;j++){
p=p->next;
}
return p->data;
}//获得指定位置数据(1~)
Lnode *SearchData(LinkList L,int n){
Lnode *p=L->next;
while(p&&p->data!=n){
p=p->next;
}
if(!p){
cout<<"未找到"<<endl;
return NULL;
}else{
cout<<"已找到"<<endl;
return p;
}
}//查找数据n
int LocationData(LinkList L,int e){
Lnode *p=L->next;
int n=1;
while(p&&p->data!=e){
p=p->next;
n++;
}
if(p){
return n;
}
return -1;
}//查找数据返回位置序号
void ListInsert(LinkList &L,int i,int n){
Lnode *p=L->next,*q=NULL;
int j=0;
while(p&&j<i-1){
p=p->next;
j++;
}
if(j>i-1||!p){
cout<<"越界,插入失败"<<endl;
}else{
q=new Lnode;
q->data=n;
q->next=p->next;
p->next=q;
L->data++;
cout<<"插入成功"<<endl;
}
}//在第i个元素之后插入数据
void ListDelete(LinkList &L,int i){
Lnode *p=L,*q=NULL;
int j=0;
while(p&&j<i-1){
p=p->next;
j++;
}
if(j>i-1||!p){
cout<<"越界,插入失败"<<endl;
}else{
q=p->next;
p->next=q->next;
cout<<"第"<<i<<"个数据"<<q->data<<"删除成功"<<endl;
delete q;
}
}//删除第i个元素
int main() {
//请自行测试
}
双向链表
#include<iostream>
using namespace std;
typedef struct DoubleList{
int data;
DoubleList *next;
DoubleList *prior;
}Lnode,*LinkList;
Lnode* CreateDoubleList(){
int n;
cout<<"输入要创建的链表节点数:"<<endl;
cin>>n;
Lnode *p=NULL,*q=NULL;
LinkList L=new Lnode;
L->data=n;
L->next=NULL;
L->prior=NULL;
p=L;
for(int i=1;i<=n;i++){
q=new Lnode;
cout<<"请输入数据:"<<endl;
cin>>q->data;
q->next=NULL;
q->prior=p;
p->next=q;
p=q;
}
return L;
}
void TravalDoubleList(LinkList L){
Lnode *p=L->next;
while(p){
cout<<p->data<<endl;
p=p->next;
}
}
int GetDoubleLength(LinkList L){
return L->data;
}//获取双链表长度
bool IsEmpty(LinkList L){
return GetDoubleLength(L)==0;
}//判空
Lnode *FindDoubleList(LinkList L,int k){
Lnode *head=L;
for(int i=0;i<k;i++){
head=head->next;
}
return head;
}//查找第k个节点
int GetDoubleListN(LinkList L,int n){
int result=-1;
Lnode *head=L;
for(int i=0;i<GetDoubleLength(L);i++){
head=head->next;
if(head->data==n){
result=i;
break;
}
}
return result;
}//寻找数值为n的节点下标
Lnode *InsertDoubleList(LinkList &Head,int k,LinkList s){
LinkList L=Head;
if(k>=L->data||k<0){
cout<<"越界插入,错误"<<endl;
return NULL;
}
for(int i=1;i<=k;i++){
L=L->next;
}
s->prior=L;
s->next=L->next;
L->next->prior=s;
L->next=s;
return Head;
}//在第k个位置后添加节点 (0~)
Lnode *DelelteDoubleList(LinkList &Head,int k){
LinkList L=Head;
if(k>=L->data||k<0){
cout<<"越界删除,错误"<<endl;
return NULL;
}
for(int i=0;i<=k;i++){
L=L->next;
}
L->prior->next=L->next;
L->next->prior=L->prior;
delete L;
return Head;
}//删除第k个节点(0~)
Lnode *ReverseDoubleList(LinkList &list){
Lnode *head,*front,*tail,*tag;
head=list;
front=list->next;
tail=front->next;
front->next=NULL;
while(tail){
tag=tail->next;
tail->next=front;
front->prior=tail;
front=tail;
tail=tag;
}
head->next=front;
front->prior=head;
return head;
}//翻转链表
Lnode *SortDoubleList(LinkList &list){
Lnode *head,*p,*q;
head=list;
p=list->next;
while(p){
q=p->next;
while(q){
if(p->data>q->data){
p->data+=q->data;
q->data=p->data-q->data;
p->data-=q->data;
}
q=q->next;
}
p=p->next;
}
return head;
}//排序
int main(){
LinkList head,q=new Lnode;
q->data=5;
head=CreateDoubleList();
TravalDoubleList(head);
// cout<<endl;
// cout<<GetDoubleLength(head)<<endl;
// p=FindDoubleList(head,2);
// cout<<p->data<<endl;
// cout<<GetDoubleListN(head,2)<<endl;
head=InsertDoubleList(head,1,q);
TravalDoubleList(head);
cout<<endl;
head=DelelteDoubleList(head,1);
TravalDoubleList(head);
}
循环链表
#include<iostream>
using namespace std;
typedef struct CircleList{
int data;
CircleList *next;
}Lnode,*LinkList;
void CreateCircleList(LinkList &L){
int n;
cout<<"输入要创建的链表节点:"<<endl;
cin>>n;
L->data=n;
Lnode *p,*q;
p=L;
while(n--){
q=new Lnode;
cout<<"输入数据:"<<endl;
cin>>q->data;
p->next=q;
q->next=L->next;
p=q;
}
}
void TravalCircleList(LinkList L){
Lnode *p=L->next;
while(p->next!=L->next){
cout<<p->data<<endl;
p=p->next;
}
}
//其余操作见List.cpp
int main(){
}
初学数据结构,还望各位大佬指正,感激不尽。