作业
双向链表按位置删除
双向链表按位置修改
双向链表按位置查找
main.c
#include "head.h"
int main(int argc, const char *argv[])
{
Doublelink L = create_head();
// 头插
int n;
datetype e;
printf("请输入要头插入元素的个数:");
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
printf("请输入要插入的值:");
scanf(" %c", &e);
insert_head(L, e);
}
// 输出
Out(L);
// 尾插
printf("\n请输入要尾插入元素的个数:");
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
printf("请输入要插入的值:");
scanf(" %c", &e);
insert_rear(L, e);
}
printf("\n尾插后的值\n");
Out(L);
// 头删:永远删除头节点
delete_head(L);
delete_head(L);
printf("\n头删后的值\n");
Out(L);
// 尾删:永远删除尾节点
delete_rear(L);
delete_rear(L);
printf("\n尾删后的值\n");
Out(L);
//按位置插入
int pos;
printf("\n请输入要插入的位置:");
scanf("%d",&pos);
printf("请输入要插入值:");
scanf(" %c",&e);
insert_by_pos(L,pos,e);
printf("\n按位置插入后的值\n");
Out(L);
//按位置删除
printf("\n请输入要删除的位置:");
scanf("%d",&pos);
deletet_by_pos(L,pos);
printf("\n按位置删除后的值\n");
Out(L);
printf("\n");
//按位置修改
printf("请输入要修改的位置:");
scanf("%d",&pos);
printf("请输入要修改的值:");
scanf(" %c",&e);
revamp_by_pos(L,pos,e);
printf("\n按位置修改后的值\n");
Out(L);
//按位置查找
printf("请输入想要查找值的下标:");
scanf("%d",&pos);
find_by_pos(L,pos);
return 0;
}
test.c
#include "head.h"
Doublelink create_head()
{
Doublelink L = (Doublelink)malloc(sizeof(struct Node));
if (L == NULL)
{
return NULL;
}
// L节点的数据域
L->len = 0;
// L后继指针域
L->next = NULL;
// L前驱指针域
L->prev = NULL;
return L;
}
// 创建普通节点
Doublelink create_node()
{
Doublelink p = (Doublelink)malloc(sizeof(struct Node));
if (p == NULL)
{
return NULL;
}
// L节点的数据域
p->date = 0;
// L后继指针域
p->next = NULL;
// L前驱指针域
p->prev = NULL;
return p;
}
// 头插
int insert_head(Doublelink L, datetype e)
{
// 判断头节点是否存储
if (L == NULL)
{
return -1;
}
// 创建新节点
Doublelink p = create_node();
if (p == NULL)
return -1;
// p的数据域
p->date = e;
// p的指针域
p->next = L->next;
p->prev = L;
if (L->next != NULL)
{
L->next->prev = p;
}
L->next = p;
L->len++;
}
// 输出
void Out(Doublelink L)
{
Doublelink p = L;
if(0==L->len)
{
printf("长度为0\n");
return 0;
}
printf("正向结果是:\n");
while (p->next)
{
p = p->next;
printf("%c\t", p->date);
}
printf("\n逆向结果是:\n");
while (p->prev->prev)
{
printf("%c\t", p->date);
p = p->prev;
}
}
// 尾插
int insert_rear(Doublelink L, datetype e)
{
// 判断头节点是否存在
if (L == NULL)
{
printf("插入失败\n");
return -1;
}
// 找到尾部
Doublelink p = L;
while (p->next)
{
p = p->next;
}
// 在p后面插入新节点
Doublelink s = create_node();
if (s == NULL)
{
return -1;
}
// s的数据域
s->date = e;
// s的指针域
s->next = p->next;
s->prev = p;
p->next = s;
L->len++;
return 0;
}
// 头删
int delete_head(Doublelink L)
{
// 判断头节点是否存在
// 判断链表是否为空
if (L == NULL || L->len == 0)
{
printf("删除失败\n");
return -1;
}
Doublelink p = L->next;
L->next = p->next;
if (p->next != NULL)
{
p->next->prev = L;
}
free(p);
p = NULL;
L->len--;
return 0;
}
// 尾删
int delete_rear(Doublelink L)
{
// 判断头节点是否存在
// 判断链表是否为空
if (L == NULL || L->len == 0)
{
printf("删除失败\n");
return -1;
}
Doublelink p = L;
// 循环到最后一位
while (p->next)
{
p = p->next;
}
// 删除p节点
p->prev->next = NULL;
free(p);
p = NULL;
L->len--;
return 0;
}
// 按位置插入
int insert_by_pos(Doublelink L, int pos, datetype e)
{
if (L == NULL || pos < 1 || pos > L->len + 1)
{
return -1;
}
Doublelink p = L;
for (int i = 0; i < pos - 1; i++)
{
p = p->next;
}
Doublelink s = create_node();
if (s == NULL)
{
return -1;
}
s->date = e;
s->next = p->next;
s->prev = p;
if (p->next != NULL)
{
p->next->prev = s;
}
p->next = s;
L->len++;
return 0;
}
int deletet_by_pos(Doublelink L, int pos)
{
if (L == NULL || L->len == 0 || pos < 1 || pos > L->len)
{
printf("插入失败\n");
return -1;
}
Doublelink p = L;
for (int i = 0; i < pos - 1; i++)
{
p = p->next;
}
Doublelink q = p->next;
p->next = q->next;
q->prev = p;
free(q);
q = NULL;
L->len--;
return 0;
}
int revamp_by_pos(Doublelink L, int pos, datetype e)
{
if (L == NULL || pos < 1 || pos > L->len + 1)
{
printf("修改失败\n");
return -1;
}
Doublelink p = L;
for (int i = 0; i < pos - 1; i++)
{
p = p->next;
}
p->next->date = e;
return 0;
}
int find_by_pos(Doublelink L,int pos)
{
if(L==NULL || pos<1 || pos>L->len)
{
printf("查找失败\n");
return -1;
}
Doublelink p=L;
for(int i=0;i<pos;i++)
{
p=p->next;
}
printf("%d下标对应的值是%c\n",pos,p->date);
return 0;
}
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef char datetype;
typedef struct Node
{
// 数据域
union
{
int len; // 头节点的数据域
datetype date; // 其他节点的数据元素
};
// 后继指针域
struct Node *next;
// 前驱指针域
struct Node *prev;
} *Doublelink;
Doublelink create_head();
Doublelink create_node();
int insert_head(Doublelink L, datetype e);
void Out(Doublelink L);
int insert_rear(Doublelink L, datetype e);
int delete_head(Doublelink L);
int delete_rear(Doublelink L);
int insert_by_pos(Doublelink L,int pos,datetype e);
int revamp_by_pos(Doublelink L, int pos, datetype e);
int find_by_pos(Doublelink L,int pos);
#include "test.c"
#endif
作业
单向循环链表尾插
单向循环链表头删
单向循环链表尾删
单向循环链表遍历
main.c
#include "head.h"
int main(int argc,const char * argv[])
{
//创建头节点
LoopLink L=create_head();
//头插
int n;
datetype e;
printf("请输入要插入的个数:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("请输入要插入的值:");
scanf("%f",&e);
insert_head(L,e);
}
printf("头插后的结果:\n");
Out(L);
//尾插
printf("\n请输入要插入数的个数:\n");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("请输入要插入的值:");
scanf("%f",&e);
insert_rear(L,e);
}
printf("尾插后的结果:\n");
Out(L);
//头删
delete_head(L);
delete_head(L);
printf("\n头删后的结果:\n");
Out(L);
//尾删
delete_rear(L);
delete_rear(L);
printf("\n尾删后的结果:\n");
Out(L);
return 0;
}
test.c
#include "head.h"
//创建头节点
LoopLink create_head()
{
LoopLink L=(LoopLink)malloc(sizeof(struct Node));
if(L==NULL)
{
return NULL;
}
L->len=0;
L->next=L;
return L;
}
//创建普通节点
LoopLink create_node()
{
LoopLink p=(LoopLink)malloc(sizeof(struct Node));
if(p==NULL)
{
return NULL;
}
p->date=0;
p->next=NULL;
return p;
}
//头插
int insert_head(LoopLink L,datetype e)
{
//1.判断头节点是否存在
if(L==NULL)
{
printf("插入失败\n");
return -1;
}
//2.创建新的节点
LoopLink p=create_node();
if(p==NULL)
{
return -1;
}
//3.p的数据域
p->date=e;
//4.p的指针域
p->next=L->next;
L->next=p;
L->len++;
return 0;
}
//输出
void Out(LoopLink L)
{
LoopLink p=L;
while(p->next!=L)
{
p=p->next;
printf("%.2f\t",p->date);
}
}
//尾插
int insert_rear(LoopLink L,datetype e)
{
//1.判断头节点是否存在
if(L==NULL)
{
printf("插入失败\n");
return -1;
}
LoopLink p=L;
while(p->next!=L)
{
p=p->next;
}
//2.创建新的节点
LoopLink s=create_node();
if(s==NULL)
{
return -1;
}
//3.p的数据域
s->date=e;
//4.p的指针域
p->next=s;
s->next=L;
L->len++;
}
/*
//头删
int delete_head(LoopLink L)
{
if(L==NULL || L->len==0)
{
printf("删除失败\n");
return -1;
}
LoopLink p=L->next;
L->next=p->next;
free(p);
p==NULL;
L->len--;
return 0;
}
*/
int delete_rear(LoopLink L)
{
if(L==NULL || L->len==0)
{
printf("删除失败\n");
return -1;
}
LoopLink p=L->next;
while(p->next->next!=L)
{
p=p->next;
printf("1");
}
LoopLink q=p;
q=p->next;
p->next=L;
free(q);
q==NULL;
L->len--;
return 0;
}
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef float datetype;
typedef struct Node
{
// 数据域
union
{
int len;
datetype date;
};
// 指针域
struct Node *next;
} *LoopLink;
LoopLink create_head();
void Out(LoopLink L);
LoopLink create_node();
int insert_rear(LoopLink L,datetype e);
int delete_head(LoopLink L);
int delete_rear(LoopLink L);
#include "test.c"
#endif