#include<stdlib.h>
#include<stdio.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
bool Init(LinkList &L)
{
L=NULL;//空表,不存在头节点
return true;
}
bool IsEmpty(LinkList L)
{
return (L==NULL);
}
//指定节点的后插
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 Insert(LinkList &L,int i,int e)
{
if(i<1)
return false;
if(i==1)
{
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=L;//L可看作一个指针,指向第一个节点,在此将L指向的节点 赋给s->next;
L=s;//将s赋给L,表示L指向s,s->next原先的第一个节点
return true;
}
LNode *p;
int j=1;
p=L;
while(p!=NULL&&j<i-1)
{
p=p->next;
j++;
}
return InsertNextNode(p,e);
}
//指定节点的前插操作(未传入头指针):偷天换日
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;
}
void print(LinkList L)
{
LNode *p;
p=L;
while(p!=NULL)
{
printf("%d\n",p->data);
p=p->next;
}
}
//按位序删除(不带头节点)
bool Delete(LinkList &L,int i,int &e)
{
if(i<1)
return false;
if(i==1)
{
LNode *s=L;
L=s->next;
e=s->data;
free(s);
return true;
}
LNode *p;
int j=0;
p=L;
while(p!=NULL&&j<i-1)
{
p=p->next;
j++;
}
if(p==NULL||p->next==NULL)//第i或i-1的节点不存在
return false;
LNode *q=p->next;
e=q->data;
p->next=q->next;
free(q);
return true;
}
//头插法:输入12,23,34;链表显示34,23,12.
// LinkList Head(LinkList &L)
// {
// int x;
// L=(LNode *)malloc(sizeof(LNode));
// L=NULL;
// LNode *s,*r;
// scanf("%d",&x);
// s=(LNode *)malloc(sizeof(LNode));
// L=s;
// s->data=x;
// s->next=NULL;
// while(x!=9999)
// {
// scanf("%d",&x);
// if(x!=9999)
// {
// r=(LNode *)malloc(sizeof(LNode));
// r->data=x;
// r->next=L;
// L=r;
// }
// }
// return L;
// }
//尾插法:不带头节点
LinkList Tail(LinkList &L)//在这里我的思路是先让空表中插入第一个节点,再按照单链表带头节点的方法实现尾插
{
LNode *s;
int x;
L=(LNode *)malloc(sizeof(LNode));
L=NULL;
s=(LNode *)malloc(sizeof(LNode));
scanf("%d",&x);
s->data=x;
s->next=L;
L=s;
LNode *r=L;
while(x!=9999)
{
scanf("%d",&x);
if(x!=9999)
{
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
}
}
r->next=NULL;
return L;
}
//头插法
LinkList Head(LinkList &L)
{
LNode *s;
int x;
L=(LNode *)malloc(sizeof(LNode));
L=NULL;
scanf("%d",&x);
while(x!=9999)
{
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
s->next=L;
L=s;
scanf("%d",&x);
}
return L;
}
int main()
{
LinkList L;
Init(L);
//Head(L);
Tail(L);
// Insert(L,1,1);
// Insert(L,2,2);
// int e=0;
// Delete(L,1,e);
// printf("%d\n",e);
print(L);
}
数据结构单链表实现(不带头节点)C语言
最新推荐文章于 2023-04-22 17:08:28 发布