#include <iostream>
using namespace std;
typedef struct linklist{
linklist *link;
int val;
}*listPoint;
//链表插入思想来自C与指针,链表处理不带头结点。
void insertType2(linklist **linkp,int new_val)
{
listPoint current;
listPoint new_linklist_point;
while ((current=*linkp)!=NULL&¤t->val<new_val)
{
linkp=¤t->link;
}
new_linklist_point=new linklist;
if (new_linklist_point==NULL)
{
cout<<" memory new errors \n";
}
new_linklist_point->val=new_val;
new_linklist_point->link=current;
*linkp=new_linklist_point;
}
//这种操作直观好理解,但是需要单独考虑特殊情况
void insertType1(linklist **head,int new_val)
{
listPoint current,previous,new_linklist;
current=*head;
previous=NULL;
while (current!=NULL&¤t->val<new_val)
{
previous=current;
current=current->link;
}
new_linklist=new linklist;
if (new_linklist==NULL)
{
cout<<"memorty errors\n";
}
new_linklist->val=new_val;
new_linklist->link=current;
if (previous==NULL)//如果为第一个插入链表节点
{
*head=new_linklist;
}
else
previous->link=new_linklist;
}
//输出链表没有头结点情况
void PrintLinklistWithOutfirstNode(listPoint head)
{
if (head==NULL)
{
cout<<"empty linklist \n";
}
while (head)
{
cout<<head->val<<" ";
head=head->link;
}
cout<<endl;
}
//输出链表有头结点情况
void PrintLinklistWithfirstNode(listPoint head)
{
if (head->link==NULL)
{
cout<<"empty linklist \n";
}
while (head->link)
{
cout<<head->link->val<<" ";
head=head->link;
}
cout<<endl;
}
//链表反转需要头结点。
linklist *reverseLinklist(listPoint head)
{
linklist *p,*q;
//判断链表至少有两个元素
if (head->link->link&&head->link)
{
p=head->link;
q=p->link;
p->link=NULL;
while (q)
{
p=q;
q=q->link;
p->link=head->link;
head->link=p;
}
}
return head;
}
//这个是没有头结点链表反转
linklist *reverseLinklistWithoutNode(listPoint current)
{
listPoint pre,next;
for (pre=NULL;current!=NULL;current=next)
{
next=current->link;
current->link=pre;
pre=current;
}
return pre;
}
void delete_linklistNode(listPoint &head,int delete_num)
{
listPoint pre,current,next;
for (pre=NULL,current=head;current!=NULL;current=next)
{
next=current->link;
if (current->val==delete_num)
{
if (pre==NULL)
{
head=head->link;
}
else
{
pre->link=current->link;
}
break;
}
pre=current;
}
}
int main()
{
int a[]={1,2,7,8,3,4};
listPoint head=NULL;
for (int i=0;i<6;i++)
{
insertType1(&head,a[i]);
}
listPoint root=new linklist;
root->link=head;
PrintLinklistWithOutfirstNode(head);
delete_linklistNode(head,8);
PrintLinklistWithOutfirstNode(head);
PrintLinklistWithOutfirstNode(reverseLinklistWithoutNode(head));
//PrintLinklistWithfirstNode(reverseLinklist(root));
}
单链表两种情况一种是带头结点的,一种不带头结点,这里实现的是不带头结点。
单链表建立删除和就地逆置
最新推荐文章于 2020-07-20 22:01:11 发布