上个作品我们做了基本的单链表,单还是缺少一些功能,今天把单链表的头插法和尾插法给大家写上
//定义带头结点的单链表
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
typedef struct LNode
{
int data; //数据域
struct LNode* next; //指针域
}LNode,*LinkList;
bool InitList(LinkList* L) //初始化
{
*L = (LNode*)malloc(sizeof(LNode)); //分配一个头结点
if (*L == NULL)
return false;//分配不足
(*L)->next = NULL;
return true;
}
void InitData_tail(LinkList* L) //尾插法
{
LNode* r = *L; //r指针永远指向最后一个结点
int i;
printf("请输入你要写入的数据,输入9999停止:");
scanf("%d", &i);
while (i != 9999)
{
LNode *p = (LNode*)malloc(sizeof(LNode));
p->data = i;
r->next = p;
r = p;
printf("请输入你要写入的数据,输入9999停止:");
scanf("%d", &i);
}
r->next = NULL;
}
void InitData_head(LinkList* L)//头插法(实现逆序)
{
LNode* p = *L;
int i;
printf("请输入你要写入的数据,输入9999停止:");
scanf("%d", &i);
while (i != 9999)
{
p = (LNode*)malloc(sizeof(LNode));
p->data = i;
p->next = (*L)->next;
(*L)->next = p;
printf("请输入你要写入的数据,输入9999停止:");
scanf("%d", &i);
}
return;
}
//LinkList LocalElem(LinkList L, int n6)//按值查找
//{
// LNode* p = L->next;
// if (p == NULL)
// return NULL;
// while (p != NULL && p->data != n6)
// {
// p = p->next;
// }
// return p;
//}
LinkList GetElem(LinkList L, int n5)//按位查找
{
LNode* p = L;
int j = 0;
if (n5 < 1)
return NULL;
while (p != NULL && j < n5)
{
p = p->next;
j++;
}
return p;
}
bool InsertLNode(LinkList* L,int i, int n1)//后插操作
{
if (i < 1)
return false;
//LNode* p = *L; //表头指针不能动,需要再建立一个指针p
//int j = 0; //用来记录p的位置
//while (p != NULL && j < i – 1)//保证p指向的都是正确位置
//{
// p = p->next;
// j++;
//}
LNode* p = GetElem(*L, i – 1);//调用查找函数
LNode* s = (LNode*)malloc(sizeof(LNode));
if (s == NULL)
return false;
s->data = n1;
s->next = p->next;
p->next = s;
return true;
}
bool Front_InserLNode(LinkList* L,int n2,int n3)//前插操作
{
if (n2 < 1)
return false;
LNode* p = *L; //指向首元素
if (p->next == NULL)
return false;
int j = 0;
while (p != NULL && j < n2 – 1)
{
p = p->next;
j++;
}
LNode *s = (LNode*)malloc(sizeof(LNode));
s->data = p->data; //把p结点下的数据域传给s结点
p->data = n3;//把要插入的数传给p结点
s->next = p->next;
p->next = s;
return true;
}
bool DeleteLNode(LinkList * L,int n4)//删除
{
if (n4 < 1)
return false;
/*LNode* p = *L;
if (p == NULL)
return false;
int j = 0;
while (p != NULL && j < n4 – 1)
{
p = p->next;
j++;
}*/
LNode* p = GetElem(*L, n4 – 1);
LNode* q = p->next;
p->next = q->next;
free(q);
return true;
}
void PrintLNode(LinkList L)//打印链表
{
if (L->next == NULL)
return;
LNode *p = L->next; //指向下一个
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\\n");
}
int main()
{
LinkList L; //指向单链表的指针
bool x1 = InitList(&L);
if (x1 == false)
return 0;
InitData_tail(&L);//初始数据,尾插法(注意创建一个指向表尾的指针)
//InitData_head(&L);//初始数据,头插法(用于逆值链表)
LNode* print = L->next;
while (print != NULL)
{
printf("%d ", print->data);
print = print->next;
}
printf("\\n");
int n;
printf("你想插入几个数:");
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
printf("请输入要在第几位插入什么数:");//后插操作
int i;
int n1;
scanf("%d %d", &i, &n1);
bool x2 = InsertLNode(&L, i, n1);//按位插入
if (x2 != true)
printf("插入失败\\n");
else
printf("插入成功\\n");
}
printf("请输入你要在第几个结点前插什么数:");//前插操作
int n2, n3;
scanf("%d %d", &n2,&n3);
bool x3;
x3 = Front_InserLNode(&L, n2, n3);
if (x3 != true)
printf("插入失败\\n");
else
printf("插入成功\\n");
printf("请输入你要删除的第几个结点:");
int n4;
scanf("%d", &n4);
DeleteLNode(&L,n4); //删除链表元素
PrintLNode(L);//打印链表
LNode* p1 = GetElem(L, 3);//按位查找,假设查找第三个结点
printf("第三个结点为%d", p1->data);
return 0;
}
评论前必须登录!
注册