刚开始学数据结构,记录一下
本文内容都是由帅气的皮皮学长指导教学,基本上是原文复刻,大佬们轻喷。
#include<iostream>
using namespace std;
//带头结点单链表//
typedef struct NodeList{//属性集合(结点)
//数据
int element;
//指向下一个结点指针
struct NodeList* next;
}node,*linklist;
//等同于: typedef struct NodeList* linklist;
//linklist与node*等价,都是用来声明结构体指针变量的
//linklist强调该指针标记标记了一个单链表
//node* 强调该指针标记了一个结点
/操作:初始化,增删改查
linklist initlist()
{//初始化带头结点的单链表
linklist l=(linklist)malloc(sizeof(node));//l指向头结点
if(l==NULL)//malloc 需要判断 内存分配是否成功
{
printf("内存分配不成功\n");//内存分配不成功
}
else{//分配成功
l->next=NULL;
}
return l;
}
void head_insert(int k,linklist l)
{//头插法添加元素
node* s=(node*)malloc(sizeof(node));
s->element=k;//数据写入结点
s->next=l->next;
l->next=s;
//尾插同学自己写
}
//中间插入:先找到位置,再插入
node* find(int k,linklist l)
{//查询k所在的结点
//查询有两种,一种是找到这个结点。另一种是找到这个结点在链表中的哪个位置
node* p=l->next;//第一个元素
while(p!=NULL&&p->element !=k)
{
p=p->next;
}
return p;//若没找到,则p=NULL,用查询结果的时候判断有没有找到
}
void mid_insert(int k,linklist l,int x)
{//在数据为x的结点后插入数据域为k的新结点
node* s=(node*)malloc(sizeof(node));
s->element=k;//数据写入结点
node* p=find(x,l);//找到P结点
s->next=p->next;//插入
p->next=s;
}
void i_insert(int k,linklist l,int i)
{//在第i个位置插入数据域为k的新结点 :先找到第i-1位置的结点
node* s=(node*)malloc(sizeof(node));
s->element=k;//数据写入结点
node *p=l;//找第i-1个结点
int j=0;
while(j<i-1)
{
p=p->next;
j++;
}
s->next=p->next;
p->next=s;
//注意:不带头结点时的代码:分i=1时的特判和i!=1
}
//尾插法
node* find2(linklist l)
{
node* p = l->next;
while (p->next!=NULL)
{
p = p->next;
}
return p;
}
void tail_insert(int k, linklist l)
{
node* s = (node*)malloc(sizeof(node));
s->element = k;
node* p = find2(l);
s->next = NULL;
p->next = s;
}
void delete_node(int k,linklist l)
{//删除数据k所在的结点:先找到这个结点,再删除
//这个链表是否存在,还能否继续删除
if(l==NULL||l->next==NULL)
{
printf("空链表\n");//返回是空链表
//要先判断这个链表是不是空的,也就是还能不能删
//认为用户是个傻子,什么离谱情况都要考虑到
return ;
}
node* p=find(k,l);
if(p==NULL)
{
printf("未找到删除结点\n");//k不在链表中
}
else{//要删除第i个结点,要先找到第i-1个
node *q=l;
while(q!=NULL)//找到第i-1个
{
if(q->next==p)
{
break;
}
q=q->next;
}
q->next =p->next;
free(p);
}
}
/*修改
与删除一样先找到p,
p->element=x;
*/
void printff(linklist l)
{
node *p;
p=l->next;
while(p!=NULL)
{
printf("%d ",p->element );
p=p->next;
}
printf("\n");
}
int main()
{
linklist l=initlist();
head_insert(1,l);
head_insert(2,l);
head_insert(3,l);
head_insert(4,l);
printff(l);
delete_node(2,l);
delete_node(4,l);
printff(l);
mid_insert(2,l,3);
mid_insert(5,l,2);
printff(l);
i_insert(6,l,1);
i_insert(7,l,3);
printff(l);
}