#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode ,*LinkList;
bool InitList(LinkList &L)
{
L=NULL;
return true;
}
//与带头结点的建表差距就是在第一个元素上面,不带头结点的需要在插入第一个元素的时候修改头指针
LinkList TailCreateList(LinkList &L)//尾插
{
LNode *s,*r;
int x;
L=NULL;
scanf("%d",&x);
while(x!=99)
{
s=(LNode*)malloc(sizeof(LNode));
/*if(s==NULL)
{
printf("内存分配失败");
exit(-1);
}*/
s->data=x;
if(L==NULL)//说明这是第一个元素
{
L=s;
r=s;
}
else
{
r->next=s;
r=s;
}
scanf("%d",&x);
}//while
r->next=NULL;
return L;
}
LinkList HeadCreateList(LinkList &L)
{
LNode *s;
int x;
L=NULL;//防止有脏数据
scanf("%d",&x);
while(x!=99)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=L;
L=s;
scanf("%d",&x);
}
return L;
}
void TraverseList(LinkList L)//遍历
{
LNode *p=L;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
return;
}
bool DeleteList(LinkList &L,int i,int &e)
{
if(i<1)
return false;
if(i==1)
{
e=L->data;
LNode *a=L;
L=L->next;
free(a);
return true;
}
LNode *p=L;
int j=1;
while(p!=NULL&&j<i-1)
{
p=p->next;
j++;
}
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 InsertList(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=s;
return true;//如果少了这一句会导致你在第一个位置插入元素的时候会插入两遍
}
LNode *p;
int j=1;
p=L;
while(p!=NULL&&j<i-1)
{
p=p->next;
j++;
}
if(p==NULL)
return false;
LNode *s=(LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
int main()
{
LinkList L;
InitList(L);
//TailCreateList(L);
HeadCreateList(L);
InsertList(L);
DeleteList(L);
TraverseList(L);
}
不带头结点的单链表的头插建表,尾插建表,插入,删除
最新推荐文章于 2023-08-31 19:29:34 发布