这几天学习了一下数据结构相关知识,把学习心得写一下。
链表即由很多个节点串起来的一根链条,链表常规操作有:1.判断是否为空,2,插入3,删除一个节点,4,打印,5,清空
下面是学习当中遇到的几个误区:
1.头指针指向头结点,头指针*head里有头结点的信息,如果head==NULL,说明头结点不存在,链表为空。
2.插入数据的时候,主要考虑这么几点:1.链表为空2.链表不为空。但是链表又根据排序要求分成很多中可能,比如:1.比头结点还小2.在链表最后3.在链表中间,特别是在链表中间,因为本节点的地址只有依靠前面节点的指针域才能了解,所以,删除和插入节点的时候,注意和删除,插入相比较的数据是当前指针的下一节点。即:p->nxet,如果和P比较的话,我们无法保存P点地址,因为只能靠前面的地址来得到,除非另外定一个*q来保存P的位置。即q=p;p=p>next;,如果不想用Q,就只能是p->next
3。在输出节点的时候,则不需要考虑了,因为和前后节点没关系,不需要保存当前节点地址,只需要while(p!=NULL)p->data就可以,这里要注意p=NULL和P==NULL的区别。p==NULL是比较,而p=NULL是赋值。完全不同。
4.清空链表注意点是,清空链表,说明链表是存在的,因为不能是p==NULL,而是head=NULL;,即头指针存在,链表存在,但是内容是空的,如果是销毁,则是P==NULL。
牢记while(*p)和while(p!=NULL)一个是指向地址的内容,一个是指向的地址
下面代码:
#include<iostream>
using namespace std;
class node //定义节点
{ public:
node(int ):data(0){};
int data;//数据
node *next;//指针域
};
class link//定义链表
{ public:
link(){};
void insert(node *newnode);//插入节点
void del(int data);//删除一个节点
void empety();//清空列表
void put();//输出链表
node *head;//头指针
};
int main()
{ link l;
node *p=new node(3);
l.insert(p);
l.del(3);
}
void link::insert(node *newnode)//ID从小到大
{//头结点也不存在,即头指针为空
node *p=head;
node *q=p;
if(head==NULL)
{head=newnode;}
else
if(head->data>newnode->data)//如果链表存在,如果插入的值比头结点还小
{newnode->next=head;head=newnode;}
else
while(1)
{ if((p->next=NULL)&&(newnode->data>p->data))
{p->next=newnode;newnode->next=NULL;break;}
else
if(newnode->data<p->next->data)
{newnode->next=p->next;p->next=newnode;break;}
p=p->next;
}
}
void link::del(int data)
{ node *p=head;
node *q=p;
if(head==NULL)
cout<<"没有数据删个头"<<endl;
else
if(head->data==data)
{head=head->next;}
else
while(p->next!=NULL)
{ if(p->next->data==data)
{p->next=p->next->next;break;}
p=p->next;
}
}