单链表练习
相关内容:
1.再理解:LNode、*LinkList
2.单链表的整表创建(头插法和尾插法)
3.单链表的读取、插入、删除
4.单链表的整表删除
//单链表的初始化、创建、插入、删除、查找
//结点的结构体:数据域、指针域
//使用头指针的指针以便可以不用返回头指针
//初始化:创建头结点、其指针域置空
//创建(头插法)形参:链表头指针的指针(头插会修改头指针指向)、结点个数,返回头指针
//插入-形参:链表头指针、插入位序、插入元素
//删除-形参:链表头指针、删除位序、无返回
//查找-形参:链表头指针、待查元素、返回位序
//打印-形参:链表头指针
#include<stdio.h>
#include<malloc.h>
typedef struct Node
{
int data;
struct Node *next;
}LNode,*LinkList;
//初始化:创建头结点、其指针域置空
void InitLinkList(LinkList *L){
//*L用于保存头指针,方便头插时更改头结点中的next指向
*L=(LNode*)malloc(sizeof(LNode));
(*L)->next=NULL;
}
//创建(头插法)形参:链表头指针的指针(头插会修改头指针指向)、结点个数,返回头指针
void CreateLinkList(LinkList *L,int n){
LNode *p;//定义新建结点
for (size_t i = 0; i < n; i++)
{
//开辟空间
p=(LNode*)malloc(sizeof(LNode));
//输入数据
printf("输入第%d个结点的数据:",i+1);
scanf("%d",&p->data);
//插入前:L A
//插入后:L p A
p->next=(*L)->next;
(*L)->next=p;
}
}
//插入-形参:链表头指针、插入位序、插入元素
void LinkListInsert(LinkList *L, int i, int e){
int j=0;//计数器
//遍历时使用的指针p,插入结点s
LNode *p,*s;
//为插入结点开辟空间
s=(LNode*)malloc(sizeof(LNode));
s->data=e;
p=(*L);//p指向头结点
while (p!=NULL&&j<i-1)//位序i,下标i-1
{
p=p->next;//后移指针p,直到到达插入位置的前一个位置
j++;
}
//插入操作
//插入前 p 插入位置 p的下一个结点
//插入后 p s p的下一个结点
s->next=p->next;
p->next=s;
}
//删除-形参:链表头指针、删除位序
void DeleteElem(LinkList *L, int i){
int j=0;//计数器
//遍历时使用的指针p,待删结点q
LNode *p,*q;
p=(*L);//p指向头结点
while (p!=NULL&&j<i-1)//位序i,下标i-1
{
p=p->next;//后移指针p,直到到达删除位置的前一个位置
j++;
}
//删除操作
//删除前 p 待删除结点 下一个结点
//删除后 p 待删除结点
q=p->next;
p->next=q->next;
free(q);
}
//查找-形参:链表头指针、待查元素、返回位序
int GetElemPosition(LinkList *L,int e){
int i=0;//下标
//遍历时使用的指针p
LNode *p;
p=(*L);//p指向头结点
while (p!=NULL)
{
if (p->data!=e)
{
p=p->next;
i++;
}
}
if (p==NULL)//未找到
return 0;
return i+1;//下标+1=位序
}
//打印
void PrintLinkList(LinkList *L){
//遍历时使用的指针p
LNode *p;
p=(*L)->next;//p指向首元结点
while (p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
int main(){
int n,i,e;
LinkList L;
InitLinkList(&L);
printf("输入结点个数:");
scanf("%d",&n);
CreateLinkList(&L,n);
PrintLinkList(&L);
printf("\n输入插入位序及元素:");
scanf("%d%d",&i,&e);
LinkListInsert(&L,i,e);
printf("插入后的链表:");
PrintLinkList(&L);
printf("\n输入待删除元素的位序:");
scanf("%d",&i);
DeleteElem(&L,i);
printf("删除指定元素后的链表:");
PrintLinkList(&L);
printf("\n输入待查询的元素:");
scanf("%d",&e);
i=GetElemPosition(&L,e);
if (i==0)
{
printf("未查询到该元素!");
}else{
printf("待查询元素的位序为:%d",i);
}
return 0;
}