#include <stdio.h>
#include <malloc.h>
typedef struct LNode
{
int data;
struct LNode *next; //指向后继元素;
} LinkNode;
void CreateList(LinkNode *&L,int a[],int n)
{
LinkNode *s;
L = (LinkNode*)malloc(sizeof(LinkNode));
L->next = NULL;
//为了实现头插法与现实的数组排列顺序相同,这里将for循环从大到小,实现顺序调换
for(int i=n-1; i>=0; i--)
{
s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = a[i];
s->next = L->next;
L->next = s;
}
}
void DispList(LinkNode *L)
{
LinkNode *p = L;
printf("顺序表为:(");
while(p->next != NULL)
{
p = p->next;
if(p->next!=NULL)
{
printf("%d,",p->data);
}
else
{
printf("%d",p->data);
}
}
printf(")\n");
}
bool ListEmpty(LinkNode *L)
{
if(L->next!=NULL)
{
printf("此表不为空表\n");
}
else
{
printf("此表为空表\n");
}
}
int ListLength(LinkNode *L)
{
int len = 0;
LinkNode *p = L;
while(p->next != NULL)
{
p = p->next;
len++;
}
printf("当前的链表长度为:%d\n\n",len);
}
int GetElem(LinkNode *L,int a,int &e)
{
int n=1;
LinkNode *p = L->next;
while(n<a && p!=NULL) //p!=NULL很重要,p=NULL意思是指针p为空,不存在data和next,
{
//因此如果不加这句后面的p=p->next本身就不存在了,就会出错
n++;
p = p->next;
}
if(a<=0 || p == NULL)
{
printf("超出搜索范围\n\n");
}
else
{
e = p->data;
printf("该链表位于第%d位置的元素为:%d\n\n",a,e);
}
}
int LocateElem(LinkNode *L,int a,int &e)
{
int n=0;
LinkNode *p = L;
while(p != NULL && p->data!=a) //这里要注意&&是短路与,因此p!=NULL应该要先放前面,否则报错
{
p=p->next;
n++;
}
if(p == NULL)
{
printf("该链表不存在这一元素\n\n");
}
else
{
e = n;
printf("该元素在链表的位置为:%d\n\n",e);
}
}
bool ListInsert(LinkNode *L,int a,int c)
{
LinkNode *s,*p=L;
int i = 1;
while(i<a && p!=NULL)
{
i++;
p = p->next;
}
if(a<=0||p==NULL)
{
printf("超出插入范围\n");
}
else
{
s = (LinkNode *)malloc(sizeof(LinkNode));
s->data = c;
s->next = p->next;
p->next = s;
}
DispList(L);
ListLength(L);
}
bool ListDelete(LinkNode *L,int a)
{
LinkNode *q,*p=L;
int i = 0,e;
while(i<a-1 && p!=NULL)
{
i++;
p = p->next;
}
if(a<=0 || p==NULL)
{
printf("超出删除范围\n");
}
else
{
q = p->next;
if(q==NULL)
{
return(printf("超出删除范围\n\n"));
}
e = q->data;
p->next = q->next;
free(q);
printf("被删除的元素为%d\n",e);
}
DispList(L);
ListLength(L);
}
void DestroyList(LinkNode *L)
{
LinkNode *pre=L,*p=L->next;
while(p!=NULL)
{
free(pre);
pre = p;
p = pre->next;
}
free(pre);
ListLength(L);
printf("销毁成功");
}
int main()
{
LinkNode *L;
int m;
printf("请输入要创建的数组元素个数:");
scanf("%d",&m);
int u[m];
for(int i=0; i<m; i++)
{
int h;
printf("请输入第%d个元素的值:",i+1);
scanf("%d",&h);
u[i] = h;
}
CreateList(L,u,m);
DispList(L);
ListEmpty(L);
ListLength(L);
int a,e;
printf("请输入要搜索的元素位置:");
scanf("%d",&a);
GetElem(L,a,e);
int b,e_1;
printf("请输入要定位的元素:");
scanf("%d",&b);
LocateElem(L,b,e_1);
int c,d;
printf("请输入要插入的元素:");
scanf("%d",&c);
printf("请输入要插入的元素位置:");
scanf("%d",&d);
ListInsert(L,d,c);
int i;
printf("请输入要删除的元素位置:");
scanf("%d",&i);
getchar();
ListDelete(L,i);
char C;
printf("是否要置空该链表(是/C)?\n");
scanf("%c",&C);
if(C =='C')
{
DestroyList(L);
}
}
C语言实现数据机构单链表(头插法)
猜你喜欢
转载自blog.csdn.net/The_RedMaple/article/details/109027449
今日推荐
周排行