我这篇是线性表的链式存储的基本操作的实现!
我会在接下来的时间把数据结构的基本的操作全部实现
觉得RGG写的不错,对你有一点儿帮助的话,请点个赞吧呜呜呜。(先赞后看,文明观看)
不多说,上代码
多看我的注释,我把一些要注意的问题都写在上面了。
对了,我想个这个系列取个名字,欢迎大家评论啊!
我倒要看看哪个幸运鹅是第一个给我评论的哈哈哈!
#include<stdio.h>
#define elemtype int
#define null 0
//定义单链表
/*******1,其中包含一个data,和一个它本身类型的指针
2,给这个结构体取了两个别名,一个是LNode型,一个是LNode *型
也就是说 LNode * p 等价于 LinkList p;
**********/
/*******
1,注意在用指针的指针时,把*L先赋给一个指针r 再进行使用
2,如果不用1 的话,就给*L加一个括号
******/
/*1,值传递
2,指针传递 的隐操作就是 LinkList *L = &L;
3,引用传递就是为变量取一个别名
*/
typedef struct LNode{
elemtype data;
struct LNode *next;
}LNode,*LinkList;
//有头节点的 头插法
void List_HeadInsert(LinkList *L){
(*L) = (LinkList)malloc(sizeof(LNode));
LinkList r=*L;
(*L)->next = null;
LNode *s ;
elemtype x;
scanf("%d",&x);
while(x!=7777){
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
s->next =r->next;
r->next = s;
scanf("%d",&x);
}
}
//遍历链表
void PrintfLinkList(LinkList L){
LNode *p = L;
if(L->next == null){
printf("this LinkList is null!");
}while(p->next!=null){
printf("%d ",p->next->data);
p=p->next;
}
}
//清空链表
void ClearLinkList(LinkList *L){
LinkList r = *L;
free(r);
}
//尾插法建立单链表(带头结点的)
void List_TailInsert(LinkList *L){
LNode *R = *L;
int x;
//R=(LinkList)malloc(sizeof(LNode));
LNode *s;
LNode *r=R; //r为表尾指针
//第一步找到链表尾结点 r 的位置
while(r->next!=null){
r=r->next;
}
scanf("%d",&x);
while(x!=7777){
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next = null;
}
//按序号查找结点值
//i为要查找的第i个结点
LNode *GetElem(LinkList L,int i){
LNode *p = L;
int j=1;
if(i==0){
return p;
}
if(i<1){
return null;
}
while(p->next&&j<i){
p=p->next;
j++;
}
return p->next;
}
//按值查找
LNode *LocateElem(LinkList L,elemtype e){
LNode *p=L->next;
while(p!=null&&p->data!=e){
p=p->next;
}
return p;
}
//插入操作(在第i个元素之前插入一个结点)
void LinkList_Insert(LinkList *L,int i,elemtype e){
//第一步:判断i值的合法性
if(i<=0){
printf("defeat to insert!");
}
//第二步:进行插入操作
if(i>=1&&GetElem(*L,i-1)!=null){
LNode *R = *L;
LNode *p;
LNode *q;
LNode *s;
s=(LNode*)malloc(sizeof(LNode));
s->data=e;
p = GetElem(R,i-1);
q = p->next;
//前插
s->next=p->next;
p->next=s;
}else{
printf("defeat!");
}
}
//删除结点
void LinkList_Delete(LinkList *L,int i){
LNode *p,*q,*R = *L;
p = GetElem(R,i-1);
q = p->next;
if(p&&q){
p->next = q->next;
free(q);
}
else{
free(p);
free(q);
}
}
//求表长
int GetList_Length(LinkList L){
int i=0;
LNode *p = L->next;
while(p!= null){
i=i+1;
p=p->next;
}
return i;
}
int main(){
LinkList L; //定义一个链表
//头插法
printf("please input some data until you input 7777 to halt it\n");
List_HeadInsert(&L);
printf("this is HeadInsert:\n");
PrintfLinkList(L);
printf("\n");
//尾插法
//ClearLinkList(&L);
printf("this is List_TailInsert:\n");
List_TailInsert(&L);
PrintfLinkList(L);
printf("\n");
//按序号查找结点值
int t=GetElem(L,3)->data;
printf("the thrid value is :");
printf("%d \n",t);
//按值查找
// LocateElem(L,6);
printf("LocateElem:");
printf("%d\n",LocateElem(L,6)->data);
//插入操作
LinkList_Insert(&L,4,100);
PrintfLinkList(L);
printf("\n");
//删除操作
LinkList_Delete(&L,4);
PrintfLinkList(L);
printf("\n");
//求表长
printf("%d",GetList_Length(L));
}