这周学习了链表的基本内容,包括了如何创造一个链表,如何初始化头结点,如何进行头插法尾插法,如何遍历链表,如何查找结点,如何在指定位置插入结点,如何删除指定结点,如何遍历链表并free除了头结点之外的结点,如何反转链表(三指针法)。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
//1.链表的定义
typedef struct Node
{
int data;
struct Node*next;
};
//2.链表的头结点初始化
Node initlist()
{
Node*list=(Node*)malloc(sizeof(Node));
list->data=0;
list->next=NULL;
return list;
}
void tailinsert(Node*list,int data)//3.尾插法
{
Node*newnode;
cin>>data;
while(data!=-1)
{
newnode=(Node*)malloc(sizeof(Node));
newnode->data=data;
newnode->next=list->next;
list->next=newnode;
cin>>data;
}
}
//4.类比得到头插法
void headinsert(Node*list,int data)
{
Node*headnode=(Node*)malloc(sizeof(Node));
headnode->next=list->next;
list->next=headnode;
}
//5.链表的输出
void print(Node*list,int data)
{
Node*p;//创造一个结点,在下一行使他指向头结点的下一个
p=head->next;
while(p)
{
cout<<p->data<<endl;
p=p->next;
}
}
//6.链表的查找
void findnode(Node*list,int data,int x)
{
Node*p=list;//创造一个指针,指向头结点
while(p&&x>=1)
{
p=p->next;
x--;
}
if(!p)
{
cout<<"此结点不存在"<<endl;
return NULL;
}
else
{
return p;
}
}
//7.在指定的地方插入结点
void insert(Node*list,int x,int data)
{
Node*pre=findnode(list,data,x-1)
if(pre==NULL)
{
cout<<"请输入正确结点"<<endl;
}
Node*pnew=(Node*)malloc(sizeof(Node));
pnew->data=data;
pnew->next=pre->next;
pre->next=pnew;
}
//8.删除指定的结点,这里是删除第x+1个结点
void delete(Node*list,int x,int data)
{
Node*pre=findnode(list,data,x);
Node*q=pre->next;
pre->next=pre->next-next;
free(q);
}
//9.逐个遍历链表,free掉除了头结点之外所有节点
void destrylist(Node*list)
{
Node*p=list->next;
Node*q=p;
//p的next是指的是p的下一个结点
//同理list->next是头结点的下一个结点
while(p)
{
p=p->next;
free(q);
q=p;
}
head->next=NULL;
}
//10.三指针法反转链表
void reverselist(Node*list;int data)
{
if(list==NULL||head->next==NULL)
return list;
Node*p=NULL;
Node*q=list->next;
Node*next;//定义了一个新的结点
while(q!=NULL)
{
next=q->next;
q->next=p;
p=q;
q=next;
}
}
int main()
{
system("pause");
return 0
}