1,动态创建链表
动态创建链表的 与静态创建链表是不同的。静态 是需要 将链表节点的数据提前 赋值。而动态链表的创建不需要提前将值赋值给节点,而是可以通过 数值输入来为节点赋值。
静态链表:需要提前 给每一个节点赋值。
每一次只能赋值一次 ,更改麻烦。
每一次更改都需要去找定义的节点 然后更改节点的值,不方便。
动态链表:不需要提前给链表每一个节点赋值。可以通过 人为提供的窗口为 节点赋值。
可以任意 给链表赋值。
增 ,删,改,查,都不需要去挨个找值,可以通过函数实现。
动态链表的创建:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Test
{
int num;
struct Test* next;
};
//动态创建链表
struct Test* creatForLink(struct Test*head)
{
//struct Test*p = head;
struct Test*new;
printf("请输入数据\n");
while(1)
{
new = (struct Test*)malloc(sizeof(struct Test)); //每一次创建一个新的节点都需要向内存申请空间
//这个空间申请之后,在这个作用域是不能被释放的要free()
new->next =NULL; //让new 里面的结构体指针为空,
scanf("%d",&(new->num));
if(new->num == 10086) //输入终止条件,输入10086跳出循环
{
printf("输入结束\n");
return head;
}
head = addLink2(head,new); //这里要注意 addLink1 的返回值需要有 结构体指针变量来承接
}
}
增
增,就是在链表的某一个节点处 将新节点插入进去。有头插法,尾插法。
这里我们用尾插法。
尾插法函数的部分代码。
///增加 链表的元素的个数 通过尾插法 增加链表的节点
struct Test* addLink3(struct Test*head)
{
struct Test*p = head;
struct Test*new;
int a;
//struct Test*p = head;
new = (struct Test*)malloc(sizeof(struct Test)); //申请空间
new->next =NULL; //
printf("请输入插入的位置\n");
scanf("%d",&a);
printf("请输入修改的数据\n");
while(p!=NULL){
if(a == p->num)
{
scanf("%d",&(new->num));
new->next = p->next;
p->next = new;
return head;
}
p = p->next;
}
printf("越界\n");
return head;
}
3,删
删除链表的某个i节点。
就是把指向 下一个节点的指针 指向下下一个节点。
//删除
struct Test* delete1(struct Test*head)
{
struct Test*p = head;
int data;
printf("请输入删除数据的位置\n");
scanf("%d",&data);
if(p->num == data){ //头节点的删除方式
p = p->next;
return p;
}
while(p->next !=NULL) //非头节点的删除方式。
{
if(p->next->num == data)
{
p->next = p->next->next;
return p;
}
p = p->next;
}
return head;
}
3,改
改,改变链表节点的数据
//改链表里面的数据
struct Test* changerLink1(struct Test*head)
{
struct Test*p = head;
int data1,data2;
printf("请输入更改数据的位置\n");
scanf("%d",&data1);
printf("请输入更改的数据\n");
scanf("%d",&data2);
while(p !=NULL)
{
if(p->num == data1)
{
p->num = data2;
return head;
}
p= p->next;
}
printf("没有您要更改的数据\n");
return head;
}
4,查
查,查看链表节点的数据。
// 链表的查找
struct Test* lookoutLink1(struct Test*head)
{
struct Test*p = head;
int data;
printf("请输入您要查找的数据\n");
scanf("%d",&data);
while(p!=NULL)
{
if(p->num == data)
{
printf("链表由此数据,数据为%d\n",p->num);
return head;
}
p = p->next;
}
printf("没有此数据\n");
return head;
}
5,全部代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Test
{
int num;
struct Test* next;
};
///增加 链表的元素的个数 通过尾插法 增加链表的节点
struct Test* addLink3(struct Test*head)
{
struct Test*p = head;
struct Test*new;
int a;
//struct Test*p = head;
new = (struct Test*)malloc(sizeof(struct Test)); //申请空间
new->next =NULL; //
printf("请输入插入的位置\n");
scanf("%d",&a);
printf("请输入修改的数据\n");
while(p!=NULL){
if(a == p->num)
{
scanf("%d",&(new->num));
new->next = p->next;
p->next = new;
return head;
}
p = p->next;
}
printf("越界\n");
return head;
}
//删除
struct Test* delete1(struct Test*head)
{
struct Test*p = head;
int data;
printf("请输入删除数据的位置\n");
scanf("%d",&data);
if(p->num == data){ //头节点的删除方式
p = p->next;
return p;
}
while(p->next !=NULL) //非头节点的删除方式。
{
if(p->next->num == data)
{
p->next = p->next->next;
return p;
}
p = p->next;
}
return head;
}
//改链表里面的数据
struct Test* changerLink1(struct Test*head)
{
struct Test*p = head;
int data1,data2;
printf("请输入更改数据的位置\n");
scanf("%d",&data1);
printf("请输入更改的数据\n");
scanf("%d",&data2);
while(p !=NULL)
{
if(p->num == data1)
{
p->num = data2;
return head;
}
p= p->next;
}
printf("没有您要更改的数据\n");
return head;
}
// 链表的查找
struct Test* lookoutLink1(struct Test*head)
{
struct Test*p = head;
int data;
printf("请输入您要查找的数据\n");
scanf("%d",&data);
while(p!=NULL)
{
if(p->num == data)
{
printf("链表由此数据,数据为%d\n",p->num);
return head;
}
p = p->next;
}
printf("没有此数据\n");
return head;
}
/************************************************************/
//删除
struct Test* delete(struct Test*head,int data)
{
struct Test*p = head;
if(p->num == data) //头节点的删除方式
{
p = p->next;
return p;
}
while(p !=NULL)
{
if(p->next->num == data)
{
p->next = p->next->next;
return head;
}
p = p->next;
}
}
//改链表里面的数据
struct Test* changerLink(struct Test*head,int data1,int data2)
{
struct Test*p = head;
while(p !=NULL)
{
if(p->num == data1)
{
p->num = data2;
return head;
}
p= p->next;
}
printf("没有您要更改的数据\n");
return head;
}
// 链表的查找
int lookoutLink(struct Test*head,int data)
{
struct Test*p = head;
while(p!=NULL) //遍历链表
{
if(p->num == data) //找到与之相等的值
{
printf("链表由此数据,数据为%d\n",p->num);
return p->num;
}
p = p->next;
}
printf("没有此数据\n");
return 0;
}
//尾插法
struct Test* addLink2(struct Test*head,struct Test*new)
{
struct Test*p = head;
if( NULL==p )
{
//printf("new->num == %d",new->num);
p = new;
return p; //这里要注意 返回的时候 返回的是 临时变量P 如果返回head 又回到空指针\
//重复 执行这个条件。
}
while(p->next!=NULL){ //找到 p->next 不为空 为空的话就进行指针偏移。知道不为空为止
//printf("new->num = %d",new->num);
p = p->next;
}
p->next = new; //把最后的一个元素插入到p->next
return head; //
}
//头插法
struct Test* addLink1(struct Test*head,struct Test*new)
{
struct Test*p = head;
if(head == NULL) //头节点为空的时候 就把new 给到 head,让头节点有值
{
head = new;
printf("new->num %d",new->num); //测试用的
return head;
}else{
head->next = new; //当头节点不为空的时候 把new的地址 存放到 head->next中
return head; //返回头节点
}
}
//动态创建链表
struct Test* creatForLink(struct Test*head)
{
//struct Test*p = head;
struct Test*new;
printf("请输入数据\n");
while(1)
{
new = (struct Test*)malloc(sizeof(struct Test)); //每一次创建一个新的节点都需要向内存申请空间
//这个空间申请之后,在这个作用域是不能被释放的要free()
new->next =NULL; //让new 里面的结构体指针为空,
scanf("%d",&(new->num));
if(new->num == 10086) //输入终止条件,输入10086跳出循环
{
printf("输入结束\n");
return head;
}
head = addLink2(head,new); //这里要注意 addLink1 的返回值需要有 结构体指针变量来承接
}
}
//链表的输出
void printLink(struct Test*head)
{
struct Test*p = head ;
while(p!=NULL)
{
printf("%d ",p->num);
p=p->next;
}
printf("\n");
}
int main()
{
struct Test*head =NULL;
struct Test*kunkun ;
int data2 = 0;
int cmd = 0;
struct Test* (*pfunc)(struct Test*);
head = creatForLink(head);
printLink(head);
printf("[1]增 [2]删 [3]改 [4]查 \n");
scanf("%d",&cmd);
switch(cmd)
{
case 1:
pfunc = addLink3;
break;
case 2:
pfunc = delete1;
break;
case 3:
pfunc = changerLink1;
break;
case 4:
pfunc = lookoutLink1;
break;
default:
printf("输入错误\n");
exit(-1);
break;
}
kunkun = pfunc(head);
printf("jjjj\n");
printLink(kunkun);
return 0;
}
/*************
struct Test*heade = creatForLink(head);
printLink(heade);
heade = delete(heade,3);
printLink(heade);
heade = changerLink(heade,6,1009);
printLink(heade);
data2 = lookoutLink(heade,1);
*/