#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
}Node,*LinkList;
void Initiate(Node *L) //初始化单链表,创建一个头结点
{
L->next=NULL;
printf("-------创建成功");
}
int Length(Node *L) //求表长
{
Node *p=L;int i=-1; //-1表示减去了头结点
while(p!=NULL)
{
p=p->next;
i++;
}
return i;
}
void Output(Node *L) //输出整个单链表
{
printf("\n开始输出");
int cout=0;
if(L->next!=NULL) //判断是否为头结点
{
for(Node *p=L->next;p!=NULL;p=p->next)
{
printf("\n第%d个数据是:%d",++cout,p->data);
}
printf("\n输出结束");
return 1;
}
printf("\n这是头结点");
}
int Loc_GetElem(Node *L,int i) //按位查找返回值
{
Node *p=L;int j=0;
if(i<1||i>Length(L))
return -1;
for(;j<i;p=p->next)
++j;
printf("\n查找结束");
return p->data;
}
int Val_GetElem(Node *L,int data) //按值查找返回位置
{
Node *p;int i=0;
for(p=L;p->data!=data&&p!=NULL;p=p->next)
i++;
if(p==NULL)
return -1;
return i;
}
LinkList Head_Insert(Node *L)//头插法插入一个节点
{
Node *s;int data;
printf("\n请输入要插入的数,666为结束:");
scanf("%d",&data); //(这里默认输入的数合法,没有作检查,不要乱输)
while(data!=666)
{
s=(Node*)malloc(sizeof(Node));
s->data=data;
s->next=L->next;
L->next=s;
printf("请输入要插入的数,666为结束:");
scanf("%d",&data);
}
printf("插入成功");
return L;
}
LinkList Tail_Insert(Node *L) //尾插法
{
Node *s;int data;
printf("\n请输入要插入的数,666为结束:");
scanf("%d",&data);
while(data!=666)
{
Node *p=L;
for(;p->next!=NULL;) //将p指针指向单链表的最后一个节点
p=p->next;
s=(Node *)malloc(sizeof(Node));
s->data=data;
s->next=NULL;
p->next=s;
printf("\n请输入要插入的数,666为结束:");
scanf("%d",&data);
}
return L;
}
LinkList Loc_Insert(Node *L,Node *d,int i) //按位置插入
{
Node *p;int loc=1;
if(i<1)
{
printf("输入的位置有误");
return -1;
}
for(p=L;loc<i&&p!=NULL;p=p->next) //这里头结点不算作数据节点,当loc数值与所需位置相等时,
loc++; //p指针指向第i-1的位置,直接插入p后即可
if(p==NULL)
{
printf("输入位置非法");
return -2;
}
d->next=p->next;
p->next=d;
printf("\n-----插入第%d个位置成功",i);
return L;
}
LinkList Del_Val(Node *L,int d) //按值删除
{
Node *p,*q;
for(p=L;p->next->data!=d&&p!=NULL;)
p=p->next;
if(p==NULL)
return -1;
q=p->next; //q就是要删除的数据
p->next=q->next;
free(q);
return L;
}
void Del_List(Node *L) //删除链表
{
Node *p;
for(;L->next!=NULL;L=p)//p指向L的下一个节点
{
p=L->next;
free(L);
}
//free(L); //删除头结点
L=NULL;
printf("\n-------删除成功");
}
int main()
{
Node *L;
L=(LinkList)malloc(sizeof(Node)); //这里申请空间如果放在初始化的函数里则执行完初始化函数后空间将不存在,所以要放在主函数里
Initiate(L);
L=Head_Insert(L);
Output(L);
Node *d;
d=(LinkList)malloc(sizeof(Node));
d->data=9;
d->next=NULL;
L=Loc_Insert(L,d,1);
Output(L);
Tail_Insert(L);
Output(L);
printf("\n表长为: %d",Length(L));
printf("\n按位查找数据为: %d",Loc_GetElem(L,2));
printf("\n按值查找位数为: %d",Val_GetElem(L,2));
L=Del_Val(L,2);
printf("\n删除后单链表为:");
Output(L);
Del_List(L);
return 0;
}
单链表的十大操作(C语言版)基础操作大全
最新推荐文章于 2020-09-21 01:37:29 发布