单链表的按位置修改
思路:参数:L pos e
1,判断链表是否存在
2,判断链表是否为空
3,判断位置是否合法
4,找到pos起名字p
5. 修改p的数据域:重新赋值
单链表的按元素修改
思路:参数头结点L 被修改的元素key 要修改的元素e
1.根据key得到位置
2,根据位置修改
单链表的空间释放
循环删除头结点后面的所有结点
for(i=0;i
{
delete_head(L);
}
删除头
free(L)
L=NULL;
头文件
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef int datatype;
typedef struct Node
{
struct Node * next;
union
{
int len;
datatype data;
};
} *linklist;
//头结点申请
linklist create_head();
//申请普通结点
linklist create_node();
//头插
int insert_head(linklist L,datatype e);
//输出单链表
void output(linklist L);
//头删
int delete_head(linklist L);
//按位置删除
int delete_sub(linklist L,int sub);
//按元素查找
int serch_data(linklist L,datatype e);
//按位置修改
int updata_sub(linklist L,int sub,datatype e);
//按元素删除
int delete_data(linklist L,datatype e);
//按元素修改
int updata_data(linklist L,datatype e,datatype k);
//释放空间
linklist free_speac(linklist L);
#endif
主函数
#include "head.h"
int main(int argc, const char *argv[])
{
//头结点申请
linklist L=create_head();
//头插
int n;
datatype e;
int sub;
printf("请输入要插入的个数:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("请输入要插入的值:");
scanf("%d",&e);
insert_head(L,e);
}
//输出单链表
output(L);
//按位置修改
printf("请输入要修改的位置:");
scanf("%d",&sub);
printf("请输入要修改的值:");
scanf("%d",&e);
updata_sub(L,sub,e);
output(L);
//按元素删除
printf("请输入要删除的值:");
scanf("%d",&e);
delete_data(L,e);
output(L);
//按元素修改
datatype k;
printf("请输入要修改的值:");
scanf("%d",&e);
printf("请输入修改后的值:");
scanf("%d",&k);
updata_data(L,e,k);
output(L);
//释放空间
free_speac(L);
return 0;
}
自定义函数
#include "head.h"
//头结点申请
linklist create_head()
{
linklist L=(linklist)malloc(sizeof(link));
if(L==NULL)
return NULL;
L->len=0;
L->next=NULL;
return L;
}
//申请普通结点
linklist create_node()
{
linklist p=(linklist)malloc(sizeof(link));
if(p==NULL)
return NULL;
p->data=0;
p->next=NULL;
return p;
}
//头插
int insert_head(linklist L,datatype e)
{
if(L==NULL)
return -1;
linklist p=create_node();
if(p==NULL)
return-1;
p->next=L->next;
L->next=p;
p->data=e;
L->len++;
}
//输出单链表
void output(linklist L)
{
if(L==NULL || L->len==0)
{
printf("遍历失败\n");
return;
}
while(L->next)
{
L=L->next;
printf("%d\t",L->data);
}
puts("");
return;
}
//头删
int delete_head(linklist L)
{
if(L==NULL || L->next==NULL)
{
printf("删除失败\n");
return -1;
}
linklist p=L->next;
L->next=p->next;
free(p);
p=NULL;
L->len--;
return 0;
}
//按位置删除
int delete_sub(linklist L,int sub)
{
if(L==NULL || L->next==NULL || sub<1 || sub>L->len)
{
printf("删除失败\n");
return -1;
}
linklist s=L;
for(int i=1;i<sub;i++)
s=s->next;
linklist q=s->next;
s->next=q->next;
free(q);
q=NULL;
L->len--;
return 0;
}
//按元素查找
int serch_data(linklist L,datatype e)
{
if(L==NULL || L->next==NULL)
{
printf("按元素查找失败\n");
return -1;
}
for(int i=1;L->next;i++)
{
L=L->next;
if(L->data==e)
return i;
}
printf("按元素查找失败\n");
return -1;
}
//按位置修改
int updata_sub(linklist L,int sub,datatype e)
{
if(L==NULL || L->next==NULL || sub<1 || sub>L->len)
{
printf("修改失败\n");
return -1;
}
for(int i=0;i<sub;i++)
L=L->next;
L->data=e;
return 0;
}
//按元素删除
int delete_data(linklist L,datatype e)
{
int sub=serch_data(L,e);
if(sub==-1)
{
printf("删除失败\n");
return -1;
}
delete_sub(L,sub);
return 0;
}
//按元素修改
int updata_data(linklist L,datatype e,datatype k)
{
int sub=serch_data(L,e);
if(sub==-1)
{
printf("修改失败\n");
return -1;
}
updata_sub(L,sub,k);
return 0;
}
//释放空间
linklist free_speac(linklist L)
{
if(L==NULL)
return NULL;
for(int i=0;i<L->len;i++)
delete_head(L);
free(L);
L=NULL;
return L;
}