循环单/双链表,创建、初始化、尾插、头插、遍历、插入、删除、判空
部分函数采用重载(此处为c++代码)
#include <iostream>
#include <stdlib.h>
#include <stdbool.h>
using namespace std;
typedef struct lnode{ //单链表结构体
int data;
struct lnode *next;
}lnode,*linklist;
typedef struct dnode{ //双向链表结构体
int data;
struct dnode *next,*prior;
}dnode,*dlinklist;
bool initlinklist(dlinklist &l) //双链表初始化(重载)
{
l=(dnode *)malloc(sizeof(dnode));
if(l==NULL)
return false;
l->next=l;
l->prior=l;
return true;
}
bool initlinklist(linklist &l) //单链表初始化(重载)
{
l=(lnode *)malloc(sizeof(lnode));
if(l==NULL)
return false;
l->next=l;
return true;
}
bool empty(dlinklist l) //双向链表判空(重载)
{
if(l->next==l)
return true;
else return false;
}
bool empty(linklist l) //单项链表判空(重载)
{
if(l->next==l)
return true;
else return false;
}
dlinklist dlinklist_tailinsert(dlinklist &l) //双向链表尾插
{
int x;
dnode *p,*s;
p=l;
cin>>x;
while(x!=0)
{
s=(dnode *)malloc(sizeof(dnode));
s->data=x;
s->next=p->next;
p->next->prior=s;
p->next=s;
s->prior=p;
p=s;
cin>>x;
}
return l;
}
linklist linklist_tailinsert(linklist &l) //单链表尾插
{
int x;
lnode *p,*s;
p=l;
cin>>x;
while(x!=0)
{
s=(lnode *)malloc(sizeof(lnode));
s->data=x;
s->next=p->next;
p->next=s;
p=s;
cin>>x;
}
return l;
}
linklist linklist_handinsert(linklist &l) //单链表头插
{
int x;
lnode *p;
cin>>x;
while(x!=0)
{
p=(lnode *)malloc(sizeof(lnode));
p->data=x;
p->next=l->next;
l->next=p;
cin>>x;
}
return l;
}
bool deletelem(linklist &l,int i,int &e) //单链表删除元素(重载)
{
int j=1;
lnode *p,*q;
p=l->next;
while(j<i-1)
{
p=p->next;
j++;
}
if(j>i)
return false;
q=p->next;
e=q->data;
p->next=q->next;
free(q);
return true;
}
bool deletelem(dlinklist &l,int i,int &e) //双向链表删除元素(重载)
{
dnode *p,*q;
int j=1;
p=l->next;
while(j<i-1)
{
p=p->next;
j++;
}
if(j>i)
return false;
q=p->next;
p->next=q->next;
q->next->prior=p;
e=q->data;
free(q);
return true;
}
bool insertelem(linklist &l,int i,int x) //单链表插入(重载)
{
int j=0;
lnode *p,*q;
p=l;
while(j<i-1)
{
j++;
p=p->next;
}
if(j>i)
return false;
q=(lnode *)malloc(sizeof(lnode));
q->data=x;
q->next=p->next;
p->next=q;
return true;
}
bool insertelem(dlinklist &l,int i,int x) //双向链表插入(重载)
{
int j=0;
dnode *p,*q;
p=l;
while(j<i-1)
{
j++;
p=p->next;
}
if(j>i)
return false;
q=(dnode *)malloc(sizeof(dnode));
q->data=x;
q->next=p->next;
p->next->prior=q;
p->next=q;
q->prior=p;
return true;
}
void looklinklist(dlinklist l) //双向链表遍历(重载)
{
int j=1;
dnode *p;
p=l->next;
while(p!=l)
{
cout<<"number "<<j<<" is "<<p->data<<" , ";
p=p->next;
j++;
}
cout<<endl;
}
void looklinklist(linklist l) //单链表遍历(重载)
{
int j=1;
lnode *p;
p=l->next;
while(p!=l)
{
cout<<"number "<<j<<" is "<<p->data<<" , ";
p=p->next;
j++;
}
cout<<endl;
}
void looklinklist(linklist l,int j) //单链表循环遍历(重载)
{
int i=1;
lnode *p;
p=l->next;
while(i<j)
{
cout<<"number "<<i<<" is "<<p->data<<" , ";
p=p->next;
i++;
}
cout<<endl;
}
int main() {
linklist l;
if(initlinklist(l))
cout<<"init succeed"<<endl;
else cout<<"error"<<endl;
if(empty(l))
cout<<"empty\n";
else cout<<"not empty\n";
linklist_tailinsert(l);
looklinklist(l);
int e;
if(deletelem(l,3,e))
cout<<"deletelem "<<e<<" succeed"<<endl;
else cout<<"deletelem error"<<endl;
looklinklist(l);
if(insertelem(l,3,e))
cout<<"insertelem "<<e<<" succeed"<<endl;
else cout<<"insertelem error"<<endl;
looklinklist(l);
cout<<"---------"<<endl;
dlinklist l2;
if(initlinklist(l2))
cout<<"init l2 succeed\n";
else cout<<"false"<<endl;
dlinklist_tailinsert(l2);
looklinklist(l2);
if(deletelem(l2,4,e))
cout<<"deldelem "<<e<<" succeed"<<endl;
else cout<<"deldelem error"<<endl;
looklinklist(l2);
if(insertelem(l2,4,e))
cout<<"insertelem "<<e<<" succeed"<<endl;
else cout<<"insertelem false"<<endl;
looklinklist(l2);
cout << "over\n";
return 0;
}