作业1:
1.1.9单链表的按位置修改
思路:参数:Lpos e
1,判断链表是否存在2,判断链表是否为空3,判断位置是否合法4,找到pos起名字p
5.修改p的数据域:重新赋值
自定义函数:
#include "head.h"
int main(int argc, const char *argv[])
{
//创建头结点
linklist L=creatr_head();
#if 0
//创建普通结点(头插)
int n;
datatype e;
printf("输入插入结点个数:");
scanf("%d",&n);
for(int i=0;i<n;i++){
printf("输入插入的值:");
scanf("%d",&e);
insert_head(L,e);
}
#else
//创建普通结点(尾插)
int n;
datatype e;
printf("输入插入结点个数:");
scanf("%d",&n);
for(int i=0;i<n;i++){
printf("输入插入的值:");
scanf("%d",&e);
insert_rear(L,e);
}
#endif
//输出
output(L);
#if 0
//头删
delete_head(L);
printf("头删之后的结果为:\n");
output(L);
#else
//尾删
delete_rear(L);
printf("尾删之后的结果为:\n");
output(L);
#endif
//按位置插入
int pos;
printf("输入要插入的位置:");
scanf("%d",&pos);
printf("输入要插入的值:");
scanf("%d",&e);
insert_pos(L,pos,e);
output(L);
//按位置删除
printf("输入要删除的位置:");
scanf("%d",&pos);
delete_pos(L,pos);
output(L);
//按位置查找
printf("输入要查找的位置:");
scanf("%d",&pos);
search_pos(L,pos);
//按元素查找
datatype key;
printf("要查找的元素为:");
scanf("%d",&key);
int flag=search_data(L,key);
if(flag==-1)
printf("查找失败\n");
else
printf("该元素在第%d个位置上\n",flag);
//按位置修改
printf("输入要修改的位置:");
scanf("%d",&pos);
printf("输入要改成的值:");
scanf("%d",&e);
xiugai_pos(L,pos,e);
output(L);
//按元素删除
printf("输入要删除的元素:");
scanf("%d",&key);
delete_key(L,key);
output(L);
//按元素修改
printf("输入要修改的元素:");
scanf("%d",&key);
printf("输入要改成的值:");
scanf("%d",&e);
xiugai_key(L,key,e);
output(L);
//释放
free_space(L);
return 0;
}
cat head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef int datatype;
typedef struct Node
{
//数据域
union{
int len;
datatype data;
};
//指针域
struct Node *next;
}*linklist;
linklist creatr_head();
linklist creatr_Node();
int insert_head(linklist L,datatype e);
int insert_rear(linklist L,datatype e);
void output(linklist L);
int delete_head(linklist L);
int delete_rear(linklist L);
int insert_pos(linklist L,int pos,datatype e);
int delete_pos(linklist L,int pos);
int search_pos(linklist L,int pos);
int search_data(linklist L,datatype key);
int xiugai_pos(linklist L,int pos,datatype e);
int delete_key(linklist L,datatype key);
int xiugai_key(linklist L,datatype key, datatype e);
linklist free_space(linklist L);
#endif
cat test.c
#include "head.h"
//创建头结点
linklist creatr_head()
{
linklist L=(linklist)malloc(sizeof(struct Node));
if(L==NULL)
return NULL;
L->len=0;//为单链表清零
L->next=NULL;//防止头结点指针域为野指针
return L;
}
//创建普通结点
linklist creatr_Node()
{
linklist p=(linklist)malloc(sizeof(struct Node));
if(p==NULL)
return NULL;
p->data=0;
p->next=NULL;
return p;
}
//头插
int insert_head(linklist L,datatype e)
{
if(L==NULL){
printf("插入失败\n");
return -1;
}
linklist p=creatr_Node();
if(p==NULL)
return -1;
//数据域
p->data=e;
//指针域
p->next=L->next;
L->next=p;
L->len++;
return 0;
}
//尾插
int insert_rear(linklist L,datatype e)
{
if(L==NULL){
printf("插入失败\n");
return -1;
}
linklist p=L;
for(int i=0;i<L->len;i++){
p=p->next;
}
linklist s=creatr_Node();
//数据域
s->data=e;
//指针域
p->next=s;
L->len++;
return 0;
}
//输出
void output(linklist L)
{
if(L==NULL||L->len==0){
printf("输出失败\n");
return;
}
linklist p=L;
for(int i=0;i<L->len;i++){
p=p->next;
printf("%d ",p->data);
}
printf("\n");
}
//头删
int delete_head(linklist L)
{
if(L==NULL||L->len==0){
printf("删除失败\n");
return -1;
}
linklist p=L->next;
L->next=p->next;
free(p);
L->len--;
return 0;
}
//尾删
int delete_rear(linklist L)
{
if(L==NULL||L->len==0){
printf("删除失败");
return -1;
}
linklist p=L;
for(int i=0;i<L->len-1;i++){
p=p->next;
}
free(p->next);
p->next=NULL;
L->len--;
}
//按位置插入
int insert_pos(linklist L,int pos,datatype e)
{
if(L==NULL||pos<1||pos>L->len+1){
printf("插入失败\n");
return -1;
}
linklist p=L;
for(int i=0;i<pos-1;i++){
p=p->next;
}
linklist s=creatr_Node();
if(s==NULL)
return -1;
s->data=e;
s->next=p->next;
p->next=s;
L->len++;
return 0;
}
//按位置删除
int delete_pos(linklist L,int pos)
{
if(L==NULL||L->len==0||pos<1||pos>L->len){
printf("删除失败\n");
return -1;
}
linklist p=L;
for(int i=0;i<pos-1;i++){
p=p->next;
}
linklist q=p->next;
p->next=q->next;
free(q);
q=NULL;
L->len--;
return 0;
}
//按位置查找
int search_pos(linklist L,int pos)
{
if(L==NULL||L->len==0||pos<1||pos>L->len){
printf("查找失败\n");
return -1;
}
linklist p=L;
for(int i=0;i<pos;i++){
p=p->next;
}
printf("该位置的值为:%d\n",p->data);
return 0;
}
//按元素查找
int search_data(linklist L,datatype key)
{
if(L==NULL||L->len==0){
printf("查找失败\n");
return -1;
}
linklist p=L;
for(int i=1;i<=L->len;i++){
p=p->next;
if(p->data==key){
return i;
}
}
return -1;
}
//按位置修改
int xiugai_pos(linklist L,int pos,datatype e)
{
if(L==NULL||pos<1||pos>L->len||L->len==0){
printf("修改失败\n");
return -1;
}
linklist p=L;
for(int i=0;i<pos;i++){
p=p->next;
}
p->data=e;
return 0;
}
//按元素删除
int delete_key(linklist L,datatype key)
{
int pos=search_data(L,key);
if(pos==-1){
printf("删除元素失败\n");
return -1;
}
delete_pos(L,pos);
return 0;
}
//按元素修改
int xiugai_key(linklist L,datatype key,datatype e)
{
int pos=search_data(L,key);
if(pos==-1){
printf("修改元素失败\n");
return -1;
}
xiugai_pos(L,pos,e);
return 0;
}
//释放
linklist free_space(linklist L)
{
if(L==NULL)
return NULL;
for(int i=0;i<L->len;i++){
delete_head(L);
}
free(L);
L=NULL;
return L;
}