单链表练习
相关内容:
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 Ap->next=(*L)->next;(*L)->next=p;}
}
//插入-形参:链表头指针、插入位序、插入元素
void LinkListInsert(LinkList *L, int i, int e){int j=0;//计数器//遍历时使用的指针p,插入结点sLNode *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,待删结点qLNode *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;//下标//遍历时使用的指针pLNode *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){//遍历时使用的指针pLNode *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;
}