单链表操作操作汇总
链表
一级目录 单链表的创建(头插法与尾插法)(主程序实现)
头插法:(主程序实现)
#include<stdlib.h>
#include<string.h>
struct node
{
int data;
struct node* next;
};
int main()
{
struct node *head,*p;
head=(struct node*)malloc(sizeof(struct node));
head->next=NULL;
int n,i;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
p=(struct node*)malloc(sizeof(struct node));
if(p==NULL)
{
printf("Error\n");
break;
}
else
{
p->data=i;
p->next=head->next;
head->next=p;
}
}
//遍历
while(head->next!=NULL)
{
printf("%d ",head->next->data);//头插输出的数是逆置的
head=head->next;
}
return 0;
}
尾插法(主程序实现)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct node
{
int data;
struct node* next;
};
int main()
{
struct node *head,*p,*q;
head=NULL;
int n,i;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
p=(struct node*)malloc(sizeof(struct node));//p相当于临时变量
if(p==NULL)
{
printf("Error\n");
break;
}
else
{
p->data=i;
p->next=NULL;
if(head==NULL)
head=p;
else
q->next=p;
q=p;
}
}
//遍历
while(head!=NULL)//注意跟头插法遍历条件的区别
{
printf("%d ",head->data);//尾插输出的数与输入时顺序一致
head=head->next;
}
return 0;
}
二级目录 单链表的增添(函数实现)
头插法
struct node* insertheadlist(struct node *head)
{
struct node *p;
p=(struct node *)malloc(sizeof(struct node));
int n;printf("请输入需要插入的值:");
scanf("%d",&n);
p->data=n;
p->next=head->next;
head->next=p;
return head;
}
尾插法
struct node* inserttaillist(struct node *head)
{
struct node *p,*q=head;
p=(struct node *)malloc(sizeof(struct node));
int n;printf("请输入需要插入的值:");
scanf("%d",&n);
p->data=n;
while(q->next!=NULL)
q=q->next;
q->next=p;
p->next=NULL;
return head;
}
指定位置插入
struct node *insertlist(struct node *head)
{
struct node *p,*q;
p=head->next;q=head;
int n;
printf("请输入需要插入节点的后一位的值:");
scanf("%d",&n);
while(p->data!=n&&p->next!=NULL)
{
q=p;
p=p->next;
}
if(p->next==NULL)
{
printf("无此节点\n");
return head;
}
else
{
struct node *t;
t=(struct node*)malloc(sizeof(struct node));
printf("请输入新节点的值:");
scanf("%d",&t->data);
q->next=t;t->next=p;
}
return head;
}
三级目录 单链表的删除(函数实现)
struct node* deletelist(struct node *head)
{
struct node *p,*q;
p=head->next;q=head;
if(p==NULL)
printf("链表为空,无法删除");
int a;
printf("请输入需要删除节点的值");
scanf("%d",&a);
while(p->data!=a&&p->next!=NULL)
{
q=p;
p=p->next;
}
if(p->next==NULL)
{
printf("无此节点\n");
return head;
}
else
{
q->next=p->next;
free(p);
}
return head;
}
四级目录 单链表的改值(函数实现)
改值
struct node* changlist(struct node *head)
{
struct node *p;
p=head->next;
int n;
printf("请输入需要改变的值:");
scanf("%d",&n);
while(p->data!=n&&p->next!=NULL)
{
p=p->next;
}
if(p->next==NULL)
{
printf("无此节点\n");
return head;
}
else
{
int a;
printf("请输入新的值:");
scanf("%d",&a);
p->data=a;
}
return head;
}
五级目录 单链表的遍历(函数实现)
遍历
void print(struct node *head)
{
printf("当前链表的值为:");
for(;head!=NULL;head=head->next)
{
printf("%d ",head->data);
}
}
汇总 函数实现单链表的各种功能(增删改查)
#include<stdio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct node
{
int data;
struct node* next;
};
//头插法创建链表函数实现
struct node* createList1(void)
{
int n;
struct node *head,*p;
p=(struct node*)malloc(sizeof(struct node));
p->next=NULL;
head=p;
printf("请输入需要创建结点个数:");
scanf("%d",&n);
printf("请输入每个节点的值:");
while(n--)
{
int a;scanf("%d",&a);
p=(struct node*)malloc(sizeof(struct node));
p->data=a;
p->next=head->next;
head->next=p;
}
return head;
}
//尾插法创建链表函数实现
struct node* createList2(void)
{
int n;
struct node *head,*tail,*p;
p=(struct node *)malloc(sizeof(struct node));
p->next=NULL;
head=p;
tail=p;
printf("请输入需要创建结点个数:");
scanf("%d",&n);
printf("请输入每个节点的值:");
while(n--)
{
int a;scanf("%d",&a);
p=(struct node *)malloc(sizeof(struct node));
p->data=a;
p->next=NULL;
tail->next=p;
tail=p;
}
return head;
}
//头插法
struct node* insertheadlist(struct node *head)
{
struct node *p;
p=(struct node *)malloc(sizeof(struct node));
int n;printf("请输入需要插入的值:");
scanf("%d",&n);
p->data=n;
p->next=head->next;
head->next=p;
return head;
}
//尾插法
struct node* inserttaillist(struct node *head)
{
struct node *p,*q=head;
p=(struct node *)malloc(sizeof(struct node));
int n;printf("请输入需要插入的值:");
scanf("%d",&n);
p->data=n;
while(q->next!=NULL)
q=q->next;
q->next=p;
p->next=NULL;
return head;
}
//指定位置插入
struct node *insertlist(struct node *head)
{
struct node *p,*q;
p=head->next;q=head;
int n;
printf("请输入需要插入节点的后一位的值:");
scanf("%d",&n);
while(p->data!=n&&p->next!=NULL)
{
q=p;
p=p->next;
}
if(p->next==NULL)
{
printf("无此节点\n");
return head;
}
else
{
struct node *t;
t=(struct node*)malloc(sizeof(struct node));
printf("请输入新节点的值:");
scanf("%d",&t->data);
q->next=t;t->next=p;
}
return head;
}
struct node* deletelist(struct node *head)
{
struct node *p,*q;
p=head->next;q=head;
if(p==NULL)
printf("链表为空,无法删除");
int a;
printf("请输入需要删除节点的值");
scanf("%d",&a);
while(p->data!=a&&p->next!=NULL)
{
q=p;
p=p->next;
}
if(p->next==NULL)
{
printf("无此节点\n");
return head;
}
else
{
q->next=p->next;
free(p);
}
return head;
}
//链表的改值
struct node* changlist(struct node *head)
{
struct node *p;
p=head->next;
int n;
printf("请输入需要改变的值:");
scanf("%d",&n);
while(p->data!=n&&p->next!=NULL)
{
p=p->next;
}
if(p->next==NULL)
{
printf("无此节点\n");
return head;
}
else
{
int a;
printf("请输入新的值:");
scanf("%d",&a);
p->data=a;
}
return head;
}
//链表的遍历
void print(struct node *head)
{
printf("当前链表的值为:");
for(;head!=NULL;head=head->next)
{
printf("%d ",head->data);
}
}
int main()
{
struct node *head=createList2();//创建
insertheadlist(head);//头插
inserttaillist(head);//尾插
insertlist(head);//中间随便插
deletelist(head);//删除
changlist(head);//改值
print(head->next);//打印
return 0;
}
除了以上操作外,链表的操作还包括单链表的逆置,排序以及双链表、循环链表的应用等,但因为这里空间太小,我们留到以后再讲。