单链表与数组相似,但是单链表堆内存的运用更加的方便,能够充分的利用零散的内存,在中间添加或者删除一个或多个元素时不需要像数组一样移动大量的元素。单链表的操作中,涉及到单链表元素变化的许耀中指向指针的指针操作。
下面是单链表的两种创建方式以及其他的一些操作(两种创建方式分别使用):
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int date;
struct Node *next;
}Node;
typedef struct Node *Link;
Link l;
void setl(Link *L, int n)//头插法
{
Link p;
int i;
printf("请输入元素:");
*L = (Link)malloc(sizeof(Node));//为头结点申请内存
(*L)->next = NULL;//建立空链表
for(i = 0; i < n; i++)
{
p = (Link)malloc(sizeof(Node));//为每个元素申请内存
scanf("%d",&p->date);
p->next = (*L)->next;
(*L)->next = p;//最后一个结点只想NULL
}
}
void setl(Link *L, int n)//尾插法
{
Link p, r;
int i;
printf("请输入元素:");
*L = (Link)malloc(sizeof(Node));//为头结点申请内存
r = (*L);
for(i = 0; i < n; i++)
{
p = (Link)malloc(sizeof(Node));//为每个元素申请内存
scanf("%d",&p->date);
r->next = p;
r = p;
}
r->next = NULL;//最后一个结点只想NULL
}
void readl(Link L) //读取链表
{
printf("你输入的元素为:");
Link p;
p = L->next;
while(p)
{
printf("%d ",p->date);
p = p->next;
}
printf("\n");
}
void deletel(Link *L, int i)//删除第i个元素
{
Link p, r;
int j = 1;
p = (*L);
while(p->next && j < i)//判断是否为第i个元素
{
p = p->next;
j++;
}
r = p->next;
p->next = r->next;
free(r);
}
void Ldele(Link *L, int m)//删除为m的元素
{
Link p, r;
p = (*L);
int flag = 1;
while(p->next){
if(p->next->date == m){
flag = 0;
break;
}
p = p->next;
}
if(flag == 1)
printf("没有这个元素!\n");
else{
r = p->next;
p->next = r->next;
free(r);
}
}
int main()
{
int n;
printf("请输入元素个数:");
scanf("%d",&n);
setl(&l,n);
readl(l);
int i;
printf("请输入要删除的位置(小于%d):",n);
scanf("%d",&i);
deletel(&l,i);
readl(l);
int m;
printf("请输入要删除的元素:");
scanf("%d",&m);
Ldele(&l,m);
read(l);
return 0;
}