以下是带表头节点的单链表的一些基本操作,包括带表头节点的单链表的创建、查找、插入、删除、反转以及打印。
#include<iostream>
using namespace std;
//抽象数据类型
typedef int datatype;
typedef struct node
{
datatype data;
struct node *next;
}ListNode;
//单链表的创建
ListNode* Create(int i)
{
datatype x;
ListNode *head,*p,*q;
head=new ListNode;
q=head;
cout<<"请输入5个数:"<<endl;
while(i--)
{
p=new ListNode;
cin>>x;
p->data=x;
p->next=NULL;
if(q!=NULL)
q->next=p;
q=p;
}
return head;
}
//查找链表第i个结点地址
ListNode* Locate(ListNode *head,int i)
{
//参数检查
if(i<0)
return NULL;
ListNode* p;
p=head;
while(i--)
p=p->next;
return p;
}
//单链表的插入
void Insert(ListNode *head,int i,datatype x)
{
//参数检查
if(i<0)
{
cout<<"插入位置不合法!"<<endl;
return;
}
if(i>5)
{
cout<<"插入位置超过链表尾端,默认插入在表尾!"<<endl;
i=5;
}
ListNode *p,*q;
q=head;
if(i==0)
{
p=new ListNode;
p->data=x;
p->next=head;
head=p;
}
else
{
i--;
while(i--)
q=q->next;
p=new ListNode;
p->data=x;
p->next=q->next;
q->next=p;
}
}
//单链表的删除
void Delete(ListNode *head,int i)
{
//参数检查
if(i<0||i>5)
{
cout<<"删除的位置不合法!"<<endl;
return;
}
ListNode *p,*q;
p=q=head;
if(i==0)
head=q->next;
else
{
i--;
while(i--)
p=p->next;
q=p->next;
p->next=q->next;
}
delete q;
}
//单链表的反转
void Reverse(ListNode *head,int i)
{
ListNode *p,*cur=head->next;
head->next=NULL;
while(cur!=NULL)
{
p=cur->next;
cur->next=head->next;
head->next=cur;
cur=p;
}
}
//打印单链表
void Print(ListNode *head,int i)
{
//参数检查
if(head==NULL)
{
cout<<"链表为空!"<<endl;
return;
}
ListNode *p;
p=head->next;
cout<<"链表中的元素为:"<<endl;
while(i--)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
//测试函数
int main()
{
ListNode *head,*n;
int i;
datatype x;
head=Create(5);
Print(head,5);
cout<<"输入要查找的结点编号:"<<endl;
cin>>i;
n=Locate(head,i);
cout<<n->data<<endl;
cout<<"输入要插入的结点编号以及对应的值:"<<endl;
cin>>i>>x;
Insert(head,i,x);
Print(head,6);
cout<<"输入要删除的结点编号:"<<endl;
cin>>i;
Delete(head,i);
Print(head,5);
cout<<"单链表反转:"<<endl;
Reverse(head,5);
Print(head,5);
return 0;
}