0.单链表结点类型的定义
struct node
{
int data;
struct node*next;
};
1.单链表头指针的定义
node *head = NULL;
2.将head初始化为带有头结点的空链表
void init(node *&head)
{
head = new node;
head->next = NULL;
}
3.建立带有头结点的空链表
node*p = head;
int n;
cin>>n;
while(n--)
{
p-next =new node;
p=p->next;//移动p,p指向下一个结点,p始终指向最后一个结点
cin>>p->data;
}
p->next = NULL;
4.前插法创建单链表
因为每次插入在链表的头部,所以输入顺序和线性表中的逻辑顺序是相反的!!
void creat(node *&head,int n)//头插法
{
L=new node;
L->next=NULL;
for(int i=0;i<n;++i)
{
p=new node;
cin>>p->data;
p->next=L->next;
L->next=p;
}
}
5.后插法创建单链表
void creat(node *&head,int n)//尾插法
{
L=new node;
L->next=NULL;
r=L;
for(i=0;i<n;++i)
{
p=new node;
cin>>p->data;
p->next=NULL;
r->next=p;\
r=p;
}
}
4、带有头结点的单链表head的遍历
node*p= head->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
//亦可写为:
for(node*p=head->next;p!=NULL;p=p->next) cout<<p->data<<" ";
//若要求行末无空格:
for(node*p=head->next;p!=NULL;p=p->next)
{
if(p!=head->next) cout<<" ";
cout<<p->data; //首元结点之后的每个结点之前都有空格
5.查找第k个/查找值为x的结点
//查找第i个数据结点:
node*p=head->next;
int i=1;
while(p!=NULL&&i<k)
{
p=p->next;
i++;
}
if(p!=NULL)//找到
...
else//找不到
...
//查找值为x的数据结点:
node*p=head->next;
while(p!=NULL&&p->data!=x)
p=p->next;
if(p!=NULL)//找到
...
else//找不到
...
6.在值为x的结点后面插入新结点e
node*p=head->next;
while(p!=NULL&&p->data!=x)
p=p->next;
if(p!=NULL)
{
node*s =new node;
s->data=e;
s->next=p->next;
p-next=s;
}
若不存在,插到最后。
node*p =head;
while(p->next!=NULL)
{
p=p->next;
if(p->data==x) break;
}
node * s= new node;
cin>>s->data;
s->next=p->next;
p->next=s;
7.删除一个结点
a.删除值为x的结点
void del(node *&head, int x)
{
node *p = head;
while (p->next != NULL)
{
if (p->next->data == x)
{
node *s = p->next;
p->next = s->next;
delete s;
break;
}
p = p->next;
}
}
b.删除第i个节点
void dele(node *&head,int n)
{
p=L;j=0;
while((p->next)&&(j<i-1))//查找第i-1个节点,p指向该结点
{p=p->next;++j}
if(!(p->next)||(j>i-1)) return ERROR;
q=p->next;
p->next=q->next;
delete q;
}
8.单链表的销毁
void destroy(node *&head) {
node *p = head;
while (p != NULL) {
node *q = p;
p = p->next;
delete q;
}
head =NULL;
}