2021-12-2-0:17
很好的做到了对于单链表中的基本操作独立完成。
今天的问题:
1.【三、直接删除】部分代码在主函数中无法运行,是不会传入;
2.【三-1.按值删除】部分代码不能做到删除链表的第一个元素;
/*
2021-12-1
单链表的定义&增删改查*/
#include <stdio.h>
#include <stdlib.h>
//定义单链表结构体
typedef struct LNode{
//数据域和指针域
int data;
struct LNode *next;
}LNode,*LinkList;
//一、单链表增:插入
//1.头插法--将数据e插入到链表L头
void HeadAdd(LNode *L,int e)
{
LNode *p=L;
LNode *q;
q=(LNode*)malloc(sizeof(LNode));
q->data=e;
q->next=p->next;
p->next=q;
}
//2.尾插法--将数据e插入到链表L尾
void TailAdd(LNode *L,int e)
{
//1.判断到达表尾
LNode *p=L;
LNode *q;
q=(LNode*)malloc(sizeof(LNode));
while(p->next!=NULL)
{
p=p->next;
}
//2.已到达,执行插入
q->data=e;
q->next=NULL;
p->next=q;
}
//二、单链表的查:按值查找
int Look(LNode *L,int e)
{
LNode *p=L;
//1.判断p->next存在
while(p->next!=NULL)
{
if (p->data==e)
{
return 1;
}
else
{
p=p->next;
}
}
return 0;
}
//三、直接删除
void deleteNode(struct LNode* node) {
//用*后边的该地址,将node的地址完全改为node->next;
//比较方便,但是其实我不懂怎么在主函数中把这个写出来
*node = *(node->next);
}
//三-1.按值删除
void DelElem(LNode *L,int e)
{
LNode *p=L;
LNode *q=L->next;
//1.查找
//!!!这段代码不能删除链表的第一个元素
while(q->next!=NULL)
{
if(q->data==e)
break;
else{
p=p->next;
q=q->next;
}
}
//2.删除
if(q->data==e)
{
p->next=q->next;
free(q);
}
}
//四、打印
void Print(LNode *L)
{
LNode *p=L;
while (p!=NULL)
{
printf("%d-",p->data);
p=p->next;
}
}
int main ()
{
//1.建立一个头节点
LNode *L;
L=(LNode*)malloc(sizeof(LNode));
L->data=1;
L->next=NULL;
Print(L); printf("\n");
//1.1.头插法插入
HeadAdd(L,2);
HeadAdd(L,3);
Print(L); printf("\n");
//1.2.尾插法插入
TailAdd(L,1);
TailAdd(L,4);
TailAdd(L,5);
Print(L); printf("\n");
//2.按值查找
printf("%d",Look(L,3));printf("\n");
//3.1按值删除
DelElem(L,1);
Print(L); printf("\n");
//4.打印
return 0;
}