#include <stdio.h>
#include <stdlib.h>
#define true 1
#define false 0
typedef struct
{
int data;//数据域
struct LNode *next;//指针域
}LNode,*LinkList;
//初始化
void InitList(LinkList L)//尾插法
{
LinkList p,r;
r = L;
int n;
printf("请输入元素个数:");
scanf("%d",&n);
int arr[n];
printf("请输入第1个元素");
//不带头结点所以第一个结点要存数据
//如果省去这一步,那么是有一个隐含的头结点,不算真正意义上的头结点
//由于是本函数的局限性,所以才有这一步,若是采取其他方法进行初始化则可避免该代码,详见2.0版
scanf("%d",&arr[0]);
L->data = arr[0];
if(n>1)
{
for(int i = 1;i<n;i++)
{
printf("请输入第%d个元素",i+1);
scanf("%d",&arr[i]);
p = (LinkList)malloc(sizeof(LNode));
p->data = arr[i];
r->next = p;//关键代码,它使得把每个结点连接在了一起。
r = p;
}
}
r->next = NULL;
}
//在第i个位置插入元素e
void InsertList(LinkList L,int i,int e)
{
if(i>ListLength(L)+1)
{
return ;
}
LinkList temp = L;
//找到插入位置(找到前一个位置)
for(int j = 1;j<i-1;j++)
{
temp = temp->next;
}
//插入代码
LinkList p = (LinkList)malloc(sizeof(LNode));
p->data = e;
p->next = temp->next;
temp->next = p;
}
//删除第i个元素
void DeleteList(LinkList L,int i)
{
if(i<0||i>ListLength(L))
{
return false;
}
LinkList temp = L;
//找到插入位置
for(int j = 1;j<i-1;j++)
{
temp = temp->next;
}
//删除代码
LinkList p = temp->next;
temp->next = p->next;
free(p);
return ;
}
//按位序查找元素
int FindList(LinkList L,int i)
{
if(i>ListLength(L))
{
return false;
}
LinkList temp = L;
//注意这里和上面插入删除找位置的区别
for(int j = 1;j<i;j++)
{
temp = temp->next;
}
printf("第%d个元素的值为%d\n",i,temp->data);
}
//按值查找
int FindnumList(LinkList L,int e)
{
LinkList temp = L;
while(temp)
{
if(temp->data == e)
{
return true;
}
temp = temp->next;
}
return false;
}
//尾插
void EndInsert(LinkList L,int e)
{
LinkList temp = L;
while(temp->next)
{
temp = temp->next;
}
LinkList newNode = (LinkList)malloc(sizeof(LinkList));
temp->next = newNode;
newNode->data = e;
newNode->next = NULL;
}
//表长
int ListLength(LinkList L)
{
LinkList temp = L;
int len = 0;
while (temp)
{
len++;
temp = temp->next;
}
return len;
}
//删除整个单链表
void clearList(LinkList L)
{
//temp用于遍历链表,r用于保存temp的下一个节点。
LinkList temp = L->next;
LinkList r;
while (temp)
{
r = temp->next;
free(temp);
temp = r;
}
free(L);
}
//判断是否为空表
int IsEmpty(LinkList *L)
{
LinkList temp = L;
if(temp->next == NULL)
{
return true;
}
else
{
return false;
}
}
//输出元素
void Print(LinkList L)
{
LinkList temp = L;
printf("表中的元素为:\n");
while(temp)
{
printf("%d ",temp->data);//注意位置不能和上一行互换
temp = temp->next;
}
printf("\n");
}
int main(int argc, char const *argv[])
{
LNode L;
InitList(&L);
Print(&L);
InsertList(&L,2,10);//在第2个位置插入10
Print(&L);
printf("len = %d\n",ListLength(&L));
FindList(&L,3);
DeleteList(&L,2);//删除第2个位置
Print(&L);
printf("%d",FindnumList(&L,10));
EndInsert(&L,255);
Print(&L);
return 0;
}
单链表-不带头结点
于 2023-09-16 17:26:42 首次发布