#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//单链表的定义--单链表的建立
typedef struct LNode
{
int data;
struct LNode *next;//可以定义自身类型的指针,不能定义自身类型的成员的其他类型
}LNode,*LinkList;//定义结构体的同时也定义结构体变量
//创建链表使用头插法传入数据,并给与特别值
LinkList Creat_LinkList1()
{
LinkList L=NULL;//头指针
LNode *s;//节点
int x,flag;
scanf("%d %d",&x,&flag);
while(x!=flag)
{
s=malloc(sizeof(LNode));//重新开辟的空间
s->data=x;//把x的值赋值为给数据域
s->next=L;//此时节点的赋值为空
L=s;//把节点的的地址赋值给L,此时头指针指向第一个节点,赋值为指针
scanf("%d",&x);
}
//printf("1\n");//表示给与成功
return L;
}
//求表长
int Length_Linklist(LinkList L)//传入的为头指针指向下一个的地址
{
LNode *p=L;
int j=0;
if(p==NULL)
{
return 0;//判断是不是空表
}
j++;//非空即为一,因为p指向的即为第一个节点的地址
while ((p->next)!=NULL)
{
/* code */
p=p->next;//?这里的指针如何移动的?
j++;
}
//printf("0\n\n");
/*LNode *q=L;
while (q->next)
{
printf("%d\n",q->data);
q=q->next;
}
printf("%d\n",q->data);*/
return j;
}
//按序号查找
LNode *Get_Linklist(LinkList L,int i)
{
LNode *s=L;
int j=0;
while((s->next!=NULL)&&j<i)//只要判断是不是指针域为空,就可以
{
s=s->next;
j++;
}
if(j==i)
{
return s;//返回的为序号为i的节点地址
}
else
{
return NULL;//若大于则放回为空
}
}//返回为节点类型的指针地址
//插入:向某个节点插入
int Insert_LinkList(LinkList L,int i,int x)//i表示插入的节点位置
{
//先判断为位置是否正确
LNode *p,*s;
p=Get_Linklist(L,i-1);//获取第i个的地址
if(p==NULL)
{
printf("位置错误");
}
else//后插
{
s=malloc(sizeof(LNode));
s->data=x;
s->next=p->next;//这里赋值的为i的下一个节点的地址
p->next=s;//然后将插入节点地址赋值给上一节点的指针域
}
/* LNode *q;
q=L;
while (q->next)
{
printf("%d\n",q->data);
q=q->next;
}
printf("%d",q->data);
return 1;*/
}
//删除
int Dele_Linklist(LinkList l,int i)
{
//前删
LNode *s,*p;
s=Get_Linklist(l,i-1);
if(s==NULL)
{
printf("位置i-1不存在");
}
else if(s->next==NULL)
{
printf("第i个节点位置不存在");
}
p=s->next;
s->next=p->next;
free(s);//释放节点
return 1;
/*LNode *q;
q=l;
while (q->next)
{
printf("%d\n",q->data);
q=q->next;
}
printf("%d",q->data);
return 1;*/
}
int main()
{
LinkList s;
//求表长;
int length;//定义长度
s=Creat_LinkList1();//函数返回值为无头节点链表的头指针指向的地址
length=Length_Linklist(s);
printf("%d\n",length);
//按序号查找
int i;//输入的序号;
LNode *recive;
scanf("%d",&i);
recive=Get_Linklist(s,i-1);//这里我只穿i-1的目的,是防止recive接收的值为i下一个数据域的地址
printf("%d",recive->data);
//插入操作
int located,x;
scanf("%d %d",&located,&x);
Insert_LinkList(s,located,x);
//删除节点
int y;//删除节点的位置
scanf("%d",&y);
Dele_Linklist(s,x);
}
初学数据结构之单链表第二弹!!!勿喷!欢迎点赞留言。