需求:
1.创建单向链表,实现按位置的增删改查与按值的修改操作
2.完成单向链表的逆置 ABCD --->DCBA
代码实现过程:
LinkList.h
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
typedef char datatype;
typedef struct Node{
union{
int len;
datatype data;
};
struct Node *next;
}LinkList;
//创建
LinkList *list_create();
//申请封装结点数据
LinkList *list_NodeIn(datatype e);
//判空
int list_ifempt(LinkList *L);
//头插入
int list_insert_head(LinkList *L,datatype e);
//遍历
int list_show(LinkList *L);
//按位置查找
LinkList *list_search_pos(LinkList *L,int pos);
//按位置插入
int list_insert_pos(LinkList *L,int pos,datatype e);
//按位置删除
int list_delete_pos(LinkList *L,int pos);
//按位置修改
int list_modify_pos(LinkList *L,int pos,datatype e);
//按值修改
int list_modify_value(LinkList *L,datatype e,datatype new_e);
//逆置
void list_reverse(LinkList *L);
#endif
LinkList.C:
#include<stdio.h>
#include<stdlib.h>
#include"LinkList.h"
//创建
LinkList *list_create(){
LinkList *L=(LinkList*)malloc(sizeof(LinkList));
if(NULL==L){
printf("创建失败\n");
return NULL;
}
L->len=0;
L->next=NULL;
printf("创建成功\n");
return L;
}
//申请封装结点数据
LinkList *list_NodeIn(datatype e){
LinkList *p=(LinkList*)malloc(sizeof(LinkList));
if(NULL==p){
printf("申请失败\n");
return NULL;
}
p->data=e;
p->next=NULL;
printf("申请成功\n");
return p;
}
//判空
int list_ifempt(LinkList *L){
return L==NULL;
}
//头插入
int list_insert_head(LinkList *L,datatype e){
if(NULL==L){
printf("插入失败\n");
return 0;
}
LinkList *p=list_NodeIn(e);
p->next=L->next;
L->next=p;
L->len++;
return 1;
}
//遍历
int list_show(LinkList *L){
if(NULL==L||list_ifempt(L)){
printf("遍历失败\n");
return 0;
}
LinkList *q=L->next;
printf("单向链表中的元素为:\n");
while(q!=NULL){
printf("%c\t",q->data);
q=q->next;
}
putchar(10);
return 1;
}
//按位置查找
LinkList *list_search_pos(LinkList *L,int pos){
if(NULL==L||list_ifempt(L)||pos<0||pos>L->len){
printf("查找失败\n");
return NULL;
}
LinkList *q=L->next;
for(int i=0;i<pos;i++){
q=q->next;
}
return q;
}
//按位置插入
int list_insert_pos(LinkList *L,int pos,datatype e){
if(NULL==L||pos<1||pos>L->len){
printf("插入失败\n");
return 0;
}
LinkList *p=list_NodeIn(e);
if(p==NULL){
printf("数据申请失败,插入失败\n");
return 0;
}
LinkList *q=list_search_pos(L,pos-1);
if(q==NULL){
printf("位置查找,插入失败\n");
return 0;
}
p->next=q->next;
q->next=p;
L->len++;
printf("插入成功\n");
}
//按位置删除
int list_delete_pos(LinkList *L,int pos){
if(NULL==L||list_ifempt(L)||pos<1||pos>L->len){
printf("删除失败\n");
return 0;
}
LinkList *p=list_search_pos(L,pos-1);
LinkList *q=p->next;
p->next=q->next;
free(q);
q=NULL;
L->len--;
printf("删除成功\n");
return 1;
}
//按位置修改
int list_modify_pos(LinkList *L,int pos,datatype e){
if(NULL==L||list_ifempt(L)||pos<1||pos>L->len){
printf("修改失败\n");
return 0;
}
LinkList *p=list_search_pos(L,pos);
p->data=e;
printf("修改成功\n");
return 1;
}
//按值修改
int list_modify_value(LinkList *L,datatype e,datatype new_e){
if(NULL==L||list_ifempt(L)){
printf("修改失败\n");
return -1;
}
LinkList *q=L->next;
while(q!=NULL){
if(e==q->data){
q->data=new_e;
printf("修改成功\n");
return 1;
}
else{
q=q->next;
}
}
printf("修改失败\n");
return 0;
}
//逆置
void list_reverse(LinkList *L){
if(NULL==L||list_ifempt(L)){
printf("操作失败\n");
return;
}
LinkList *p=L->next;
L->next=NULL;
while(p!=NULL){
list_insert_head(L,p->data);
p=p->next;
}
printf("操作成功\n");
}
main.c
#include<stdlib.h>
#include"LinkList.h"
#include<stdio.h>
int main(int argc, const char *argv[])
{
LinkList *L=list_create();
if(NULL==L){
printf("创建失败\n");
return -1;
}
list_insert_head(L,'0');
list_show(L);
list_insert_pos(L,1,'1');
list_insert_pos(L,1,'3');
list_insert_pos(L,1,'5');
list_insert_pos(L,1,'7');
list_show(L);
list_delete_pos(L,2);
list_show(L);
list_modify_pos(L,3,'9');
list_show(L);
list_modify_value(L,'9','x');
list_show(L);
list_reverse(L);
list_show(L);
return 0;
}
代码实现结果:
创建成功
申请成功
单向链表中的元素为:
0
申请成功
插入成功
申请成功
插入成功
申请成功
插入成功
申请成功
插入成功
单向链表中的元素为:
0 7 5 3 1
删除成功
单向链表中的元素为:
0 7 3 1
修改成功
单向链表中的元素为:
0 7 3 9
修改成功
单向链表中的元素为:
0 7 3 x
申请成功
申请成功
申请成功
申请成功
操作成功
单向链表中的元素为:
x 3 7 0