#include<stdio.h>
#include<stdlib.h>
#define FALSE 0
#define TRUE 1
typedef int Datatype;
typedef struct Node{
Datatype data;
struct Node *next;
}Linklist;
Linklist *InitList(Linklist *L) //初始化链表
{
L=(Linklist *)malloc(sizeof(Linklist));
L->next=NULL;
return L;
}
void DestroyList(Linklist *L) //销毁单链表
{
Linklist *pre=L,*p=L->next;
while(p!=NULL)
{
free(pre);
pre=p;
p=pre->next;
}
free(pre);
}
int ListEmpty(Linklist *L)
{
return (L->next==NULL);
}
void Create_LinkF(Linklist *P,Datatype *value,int n)//头插法
{
Linklist *s;
int i;
for(i=0;i<n;i++)
{
s=(Linklist *)malloc(sizeof(Linklist));
s->data=*(value+i);
s->next=P->next;
P->next=s;
}
}
void Create_LinkR(Linklist *p,Datatype *value,int n)//尾插法
{
Linklist *s;
// r=p;
int i;
for(i=0;i<n;i++)
{
s=(Linklist *)malloc(sizeof(Linklist));
s->data=*(value+i);
p->next=s;
p=s;
}
p->next=NULL;
}
void DispList(Linklist *L) //显示链表
{
Linklist *p=L->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
putchar(10);
}
int ListLength(Linklist *L) //计算链表的长度
{
int n=0;
while(L->next!=NULL)
{
n++;
L=L->next;
}
return n;
}
int LocateElem(Linklist *L,Datatype e,int *p) //查找某一元素的下标
{
int i=-1,j=0;
Linklist *s;
s=L;
while(s->next!=NULL)
{
s=s->next;
i++;
if(s->data==e)
{
*p=i;
p++;
j++;
}
}
return j;
}
int LinklistInsert(Linklist *L,int i,Datatype value) //在指定下标插入元素
{
Linklist *s;
s=(Linklist *)malloc(sizeof(Linklist));
int j=0;
while(j<i-1&&L!=NULL)
{
j++;
L=L->next;
}
if(L==NULL)
{
return -1;
}
else
{
s->data=value;
s->next=L->next;
L->next=s;
return 0;
}
}
int ListDelete(Linklist *L,int i) //删除指定下标的元素
{
Linklist *s;
int j=0;
while(j<i&&L!=NULL)
{
j++;
L=L->next;
}
if(L==NULL)
{
return -1;
}
else
{
s=L->next;
if(s==NULL)
return -1;
L->next=s->next;
free(s);
return 0;
}
}
int main()
{
Linklist *L;
Datatype *a,value;
int n,i,j,flag=0,*P;
P=(Datatype *)malloc(sizeof(Datatype));
a=(Datatype *)malloc(sizeof(Datatype));
L=InitList(L);
printf("请输入链表的长度:\n");
scanf("%d",&n);
printf("请输入%d个数:\n",n);
for(i=0;i<n;i++)
{
scanf("%d",&value);
*(a+i)=value;
}
printf("请选择 1 头插法建立链表。 2 尾插法建立链表。\n");
scanf("%d",&flag);
if(flag==1)
{ Create_LinkF(L,a,n); }
else if(flag==2)
{ Create_LinkR(L,a,n); }
if(ListEmpty(L)==FALSE)
{
printf("该链表为:\n");
DispList(L);
}
else if(ListEmpty(L)==TRUE)
{ printf("该链表为空!\n"); }
printf("该链表长度=%d\n",ListLength(L));
printf("请输入要查找的数:\n");
scanf("%d",&value);
j=LocateElem(L,value,P);
for(i=0;i<j;i++)
printf("%d的下标为:%d \n",value,*(P+i));
printf("请输入要插入的位置以及要插入的值:\n");
scanf("%d",&i);
scanf("%d",&value);
LinklistInsert(L,i,value);
printf("执行插入操作之后的链表为:\n");
DispList(L);
printf("请输入要删除数的下标:\n");
scanf("%d",&i);
ListDelete(L,i);
printf("执行删除操作后的链表:\n");
DispList(L);
DestroyList(L);
return 0;
}
老师要我们写单链表基本操作。。。
原文:https://www.cnblogs.com/erlongi/p/10672684.html