赞
踩
链表是指通过链式存储(使用任意不连续的内存空间)存放线性表中的数据元素,其中单链表由于一个结点只含一个指针域只能单向链接,故称单链表。
目录
1. 本篇文章通过自定义头插、尾插、任意结点插入、任意结点删除以及打印函数,来实现单链表。
2. 代码中的struct Node* tp1=new Node()(C++写法)也可写为struct Node* tp1=(Node*)malloc(sizeof(struct Node))(C语言写法)。
- #include"stdlib.h"
- #include"stdio.h"//头文件
-
- /*malloc(m)函数,开辟m字节长度的地址空间,并返回这段空间的首地址
- sizeof(x)运算,计算变量x的长度
- free(p)函数,释放指针p所指变量的存储空间,即彻底删除一个变量
-
- 需要加载头文件:<stdlib.h>*/
-
- struct Node
- {
- int data;
- struct Node* next;
- };//结构体
-
- struct Node* head;
- struct Node* last;//全局变量
该方法会将每次新接收到的数据都放在链表的最前面。
struct Node* tp1=new Node();//(C++写法)也可以写成struct Node* tp1=(Node*)malloc(sizeof(struct Node))(C语言写法)
tp1->data=x;
tp1->next=head;
head=tp1;
图解:
总代码如下:
- #include"stdlib.h"
- #include"stdio.h"
- struct Node
- {
- int data;
- struct Node* next;
- };
- struct Node* head;
- struct Node* last;
-
- void Insert_1(int x)
- {
- struct Node* tp1=new Node();
- tp1->data=x;
- tp1->next=head;
- head=tp1;
- }//自定义头插入函数(Insert_1)
-
- void Print()
- {
- struct Node* tp=head;
- printf("\n");//空一行
- printf("链表为:\n");
- while(tp!=NULL)
- {
- printf("%d ",tp->data);
- tp=tp->next;
- }
- }//自定义打印函数(Print)
-
- int main()
- {
- head=NULL;
- int i,n,x;
- printf("请输入链表长度:\n");
- scanf("%d",&n);
- printf("\n");//空一行
- for(i=0;i<n;i++)
- {
- printf("请输入链表倒数第%d个元素:\n",i+1);
- scanf("%d",&x);
- Insert_1(x);
- }
- Print();
- }
该方法会将每次新接收到的数据都按输入顺序存放在链表里。
struct Node* tp1=new Node();//(C++写法)也可以写成struct Node* tp1=(Node*)malloc(sizeof(struct Node))(C语言写法)
if(head==NULL)
{
tp1->data=x;
tp1->next=NULL;
head=tp1;
last=tp1;
}
else
{
last->next=tp1;
tp1->data=x;
tp1->next=NULL;
last=tp1;
}
图解:
总代码如下:
- #include"stdlib.h"
- #include"stdio.h"
- struct Node
- {
- int data;
- struct Node* next;
- };
- struct Node* head;
- struct Node* last;
-
- void Insert_2(int x)
- {
-
- struct Node* tp1=new Node();
- if(head==NULL)
- {
- tp1->data=x;
- tp1->next=NULL;
- head=tp1;
- last=tp1;
- }
- else
- {
- last->next=tp1;
- tp1->data=x;
- tp1->next=NULL;
- last=tp1;
- }
- }//自定义尾插入函数(Insert_2)
-
- void Print()
- {
- struct Node* tp=head;
- printf("\n");//空一行
- printf("链表为:\n");
- while(tp!=NULL)
- {
- printf("%d ",tp->data);
- tp=tp->next;
- }
- }//自定义打印函数(Print)
-
- int main()
- {
- head=NULL;
- int i,n,x;
- printf("请输入链表长度:\n");
- scanf("%d",&n);
- printf("\n");//空一行
- for(i=0;i<n;i++)
- {
- printf("请输入链表第%d个元素:\n",i+1);
- scanf("%d",&x);
- Insert_2(x);
- }
-
- Print();
- }
该代码可以实现在链表任意节点插入数据。
struct Node* tp1=new Node();//(C++写法)也可以写成struct Node* tp1=(Node*)malloc(sizeof(struct Node))(C语言写法)
tp1->data=data;
tp1->next=NULL;
if(n==1)
{
tp1->next=head;
head=tp1;
}
else
{
struct Node* tp2=head;
for(int i=0;i<n-2;i++)
{
tp2=tp2->next;
}
tp1->next=tp2->next;
tp2->next=tp1;
}
- #include"stdlib.h"
- #include"stdio.h"
- struct Node
- {
- int data;
- struct Node* next;
- };
- struct Node* head;
- struct Node* last;
-
- void Insert_3(int data,int n)
- {
- struct Node* tp1=new Node();//或者struct Node* tp=(Node*)malloc(sizeof(struct Node))(创建一个节点)
- tp1->data=data;
- tp1->next=NULL;
- if(n==1)
- {
- tp1->next=head;
- head=tp1;
- }
- else
- {
- struct Node* tp2=head;
- for(int i=0;i<n-2;i++)
- {
- tp2=tp2->next;
- }
- tp1->next=tp2->next;
- tp2->next=tp1;
- }
- }//自定义任意插入函数(Insert_3)
-
- void Print()
- {
- struct Node* tp=head;
- printf("\n");//空一行
- printf("链表为:\n");
- while(tp!=NULL)
- {
- printf("%d ",tp->data);
- tp=tp->next;
- }
- }//自定义打印函数(Print)
-
- int main()
- {
- head=NULL;
- int i,n,x,y,z;
- printf("请输入链表长度:\n");
- scanf("%d",&n);
- printf("\n");
- for(i=0;i<n;i++)
- {
- printf("请插入链表第%d个元素及位置(s)(1≤s≤%d,s∈N*):\n",i+1,i+1);
- scanf("%d%d",&x,&y);
- Insert_3(x,y);
- }
- Print();
- }
- #include"stdlib.h"
- #include"stdio.h"
- struct Node
- {
- int data;
- struct Node* next;
- };
- struct Node* head;
- struct Node* last;
-
- void Insert_2(int x)
- {
-
- struct Node* tp1=new Node();
- if(head==NULL)
- {
- tp1->data=x;
- tp1->next=NULL;
- head=tp1;
- last=tp1;
- }
- else
- {
- last->next=tp1;
- tp1->data=x;
- tp1->next=NULL;
- last=tp1;
- }
- }//自定义尾插入函数(Insert_2)
-
- void Print()
- {
- struct Node* tp=head;
- printf("\n");//空一行
- printf("链表为:\n");
- while(tp!=NULL)
- {
- printf("%d ",tp->data);
- tp=tp->next;
- }
- }//自定义打印函数(Print)
- void Insert_3(int data,int n)
- {
- struct Node* tp1=new Node();//或者struct Node* tp=(Node*)malloc(sizeof(struct Node))(创建一个节点)
- tp1->data=data;
- tp1->next=NULL;
- if(n==1)
- {
- tp1->next=head;
- head=tp1;
- }
- else
- {
- struct Node* tp2=head;
- for(int i=0;i<n-2;i++)
- {
- tp2=tp2->next;
- }
- tp1->next=tp2->next;
- tp2->next=tp1;
- }
- }//自定义任意插入函数(Insert_3)
-
- int main()
- {
- head=NULL;
- int i,n,x,y,z;
- printf("请输入链表长度(不包括将要插入数据):\n");
- scanf("%d",&n);
- printf("\n");//空一行
- for(i=0;i<n;i++)
- {
- printf("请输入链表第%d个元素:\n",i+1);
- scanf("%d",&x);
- Insert_2(x);
- }
- printf("请输入要插入链表的数据及位置:\n");
- scanf("%d%d",&x,&y);
- Insert_3(x,y);
- Print();
- }
- //前面的代码就不展示了
-
- int main()
- {
- head=NULL;
- Insert_3(3,1);
- Insert_3(1,2);
- Insert_3(4,3);
- Print();
- }
-
- //输出:3 1 4
该代码可以实现删除链表中任意节点里的数据。
struct Node* tp1=head;
if(n==1)
{
head=tp1->next;
free(tp1);
}
else
{
struct Node* tp2;
int i;
for(i=0;i<n-2;i++)
{
tp1=tp1->next;
}
tp2=tp1->next;
tp1->next=tp2->next;
free(tp2);
}
总代码如下:
- #include"stdlib.h"
- #include"stdio.h"
- struct Node
- {
- int data;
- struct Node* next;
- };
- struct Node* head;
- struct Node* last;
-
- void Delect(int n)
- {
- struct Node* tp1=head;
- if(n==1)
- {
- head=tp1->next;
- free(tp1);
- }
- else
- {
- struct Node* tp2;
- int i;
- for(i=0;i<n-2;i++)
- {
- tp1=tp1->next;
- }
- tp2=tp1->next;
- tp1->next=tp2->next;
- free(tp2);
- }
- }//自定义删除函数(Delect)
-
- void Insert_2(int x)
- {
-
- struct Node* tp1=new Node();//或者struct Node* tp=(Node*)malloc(sizeof(struct Node))(创建一个节点)
- if(head==NULL)
- {
- tp1->data=x;
- tp1->next=NULL;
- head=tp1;
- last=tp1;
-
- }
- else
- {
- last->next=tp1;
- tp1->data=x;
- tp1->next=NULL;
- last=tp1;
- }
- }//自定义尾插入函数(Insert_2)
-
- void Print()
- {
- struct Node* tp=head;
- printf("\n");//空一行
- printf("链表为:\n");
- while(tp!=NULL)
- {
- printf("%d ",tp->data);
- tp=tp->next;
- }
- }//自定义打印函数(Print)
-
- int main()
- {
- head=NULL;
- int i,n,x,y;
- printf("请输入链表长度:\n");
- scanf("%d",&n);
- printf("\n");//空一行
- for(i=0;i<n;i++)
- {
- printf("请输入链表第%d个元素:\n",i+1);
- scanf("%d",&x);
- Insert_2(x);
- }
- Print();
- printf("\n");//空一行
- printf("\n请输入需要删除链表元素的位置(s):\n");
- scanf("%d",&y);
- Delect(y);
- Print();
- }
感谢各位大佬们的阅读,要是能再点个赞加个关注就更好了\^o^/
如有不妥的地方,请各位大佬移步评论区指正
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。