//带头节点
#include<stdio.h>
#include<stdlib.h>
typedef struct code{
int data;
struct code *next;
}LNode,*LinkList;
//初始化
bool Init(LinkList &L)
{
L=(LNode *)malloc(sizeof(LNode));
if(L==NULL)//内存分配失败
return false;
L->next=NULL;
return true;
}
//指定节点的后插操作
bool InsertNextNode(LNode *p,int e)
{
if(p==NULL)//结点为空无法后插
return false;
LNode *s=(LNode *)malloc(sizeof(LNode));
if(s==NULL)//内存分配失败
return false;
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
//指定节点的前插操作(未传入头指针)
bool InsertPreNode(LNode *p,int e)
{
if(p==NULL)
return false;
LNode *s=(LNode *)malloc(sizeof(LNode));
if(s==NULL)//内存分配失败
return false;
s->data=p->data;
s->next=p->next;
p->data=e;
p->next=s;
return true;
}
//按位序查找
LNode *GetElem(LinkList L,int i)
{
int j=1;
LNode *p=L->next;
if(i==0)
return L;
if(i<1)
return NULL;
while(p!=NULL&&j<i)
{
p=p->next;
j++;
}
return p;
}
//按值查找
LNode *LocateElem(LinkList L,int e)
{
LNode *p=L->next;//头节点不存数据
while(p!=NULL&&p->data!=e)
{
p->next;
}
return p;
}
bool IsEmpty(LinkList L)
{
if(L->next==NULL)
return true;
else
return false;
}
//头插法:输入12,23,34;链表显示34,23,12.
LinkList Head(LinkList &L)
{
LNode *s;
int x;
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
scanf("%d",&x);
while(x!=9999)
{
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
s->next=L->next;
L->next=s;
scanf("%d",&x);
}
return L;
}
//尾插法:插入12,34,56,输出12,34,56
LinkList Tail(LinkList &L)
{
int x;
L=(LNode *)malloc(sizeof(LNode));//LinkList==LNode *,一个强调链表,一个强调节点,可读性
LNode *s,*r=L;//r为一直指向表尾的指针
scanf("%d",&x);
while(x!=9999)
{
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next=NULL;
return L;
}
//按位序插入
bool Insert(LinkList &L,int i,int e)
{
if(i<1)
return false;
LNode *p=GetElem(L,i-1);
return InsertNextNode(p,e);
}
//按位序删除节点
bool Delete(LinkList &L,int i,int &e)
{
if(i<1)
return false;
LNode *p=GetElem(L,i-1);
if(p==NULL)
return false;
if(p->next==NULL)
return false;
LNode *q=p->next;
e=q->data;
p->next=q->next;
free(q);
return true;
}
//删除指定节点(未传入头指针):偷天换日
bool DeleteNode(LNode *p)
{
if(p==NULL)
return false;
LNode *s=p->next;//p的下一个节点
if(s==NULL)//p为最后一个节点,删除失败,这种只能从表头遍历寻找p的前驱节点,需要头指针
return false;
p->next=s->next;
p->data=s->data;
free(s);
return true;
}
//打印
void print(LinkList L)
{
LNode *p;
p=L->next;
while(p!=NULL)
{
printf("%d\n",p->data);
p=p->next;
}
}
int main()
{
LinkList L;
Init(L);
//Head(L);
Tail(L);
Insert(L,1,45);
print(L);
int e=-1;
Delete(L,2,e);//e接受删除节点的数据
print(L);
return 0;
}
数据结构复习单链表C语言代码实现
于 2023-04-04 19:25:17 首次发布