#include <stdio.h>
#include <stdlib.h>
/*2,宏定义部分--bool*/
#define bool char
#define true 1
#define false 0
/*3.自定义数据元素类型*/
typedef int Elemtype;
/*4.单链表的结构体*/
typedef struct LNode
{
Elemtype data; //元素
struct LNode* next; //指向下个结点的指针
}LNode, *LinkList; //结点和头指针
/*5.单链表的初始化(头结点的初始化)*/
bool InitLinkList(LinkList L)
{
L->data = 0;
L->next = NULL;
return true;
}
/*6.单链表的打印*/
bool Print_LinkList(LinkList L)
{
LNode* p = L;
while(p->next)
{
p = p->next;
printf("%d->",p->data);
}
printf("NULL\n");
return true;
}
/*7.单链表的头插法*/
bool insert_Head(LinkList L)
{
int NewData;
//开辟一个空间给新结点
LNode* NewNode = (LNode*)malloc(sizeof(LNode));
//给新结点赋值
printf("请输入要头插的元素:");
scanf("%d",&NewData);
NewNode->data = NewData;
//让新元素指向第一个结点
NewNode->next = L->next;
//让头结点指向新结点
L->next = NewNode;
//长度加1(用头节点的data储存链表长度)
L->data++;
return true;
}
/*8.单链表的尾插法*/
bool Insert_tail(LinkList L)
{
LNode* NewNode;
//用来找到尾结点的指针
LNode* TailNode = L;
Elemtype NewData;
NewNode = (LNode*)malloc(sizeof(LNode));
NewNode->next = NULL;
printf("请输入要尾插的元素:");
scanf("%d",&NewData);
NewNode->data = NewData;
//找到尾结点
while(TailNode->next)
{
TailNode = TailNode->next;
}
//让尾结点指向新结点
TailNode->next = NewNode;
L->data++;
return true;
}
/*9.单链表的按位查找*/
LNode* GetElem(LinkList L, int i)
{
LNode* p = L;
if(i == 0)
{
return L;
}
if(i < 1 || i > L->data)
{
printf("error!\n");
return NULL;
}
for(int j = 0; j < i; j++)
{
p = p->next;
}
return p;
}
/*10.按值查找数据元素*/
LNode* LocateElem(LinkList L, Elemtype e)
{
if(!L->next)
{
printf("empty!\n");
return L;
}
LNode* p = L;
while(p->next)
{
p = p->next;
if(p->data == e)
{
return p;
}
}
return NULL;
}
/*11.按位插入数据元素*/
bool Insert_site(LinkList L, int i, Elemtype e)
{
if(i < 1 || i > (L->data+1))
{
printf("error!\n");
return false;
}
LNode* NewNode = (LNode*)malloc(sizeof(LNode));//新结点
NewNode->data = e;
LNode* p = GetElem(L, i-1); //用来指向插入结点前一个结点
NewNode->next = p->next;
p->next = NewNode;
L->data++;
return true;
}
/*12.按位删除*/
bool DeleteSite(LinkList L, int i)
{
if(i < 1 || i > L->data)
{
printf("empty!\n");
return false;
}
LNode* p = GetElem(L, i-1);
LNode* q = p->next;//储存删除的结点
p->next = p->next->next;
free(q);
return true;
}
/*13.销毁单链表*/
bool Destory_Linklist(LinkList L)
{
while(L->data)
{
DeleteSite(L,1);
L->data--;
}
printf("销毁完毕!\n"); //不知道为啥这个没输出,有大神的话可以指教一下
free(L);
return true;
}
int main()
{
//定义结构体并开辟空间
LinkList L = (LNode*)malloc(sizeof(LNode));
//初始化
InitLinkList(L);
//插入一些元素用于测试
Insert_tail(L);
Insert_tail(L);
Insert_tail(L);
//插入后的表内容
Print_LinkList(L);
//测试按位查找
//printf("请输入查找结点的位置:");
//LNode* p = GetElem(L,0);
//printf("%d",p->data);
//测试按位插入
Insert_site(L,1,78);
Print_LinkList(L);
//测试按位删除
DeleteSite(L, 2);
Print_LinkList(L);
//测试销毁链表
Destory_Linklist(L);
}
08-07
60
06-17
314