基本的曾删改查,包括反转(两种方法,头插法和递归),升序排序,去重操作。(都是基本代码,没有复杂的逻辑,看不懂可以私信,有时间看到了会回复)。
main.c
#include "linkList.h"
int main(int argc, const char *argv[])
{
LinkList list=list_create();
insert(list,55);
insert(list,66);
insert(list,77);
insert(list,88);
insert(list,77);
insert(list,88);
insert(list,88);
insert(list,88);
iterator(list);
//LinkList p=searchToIndex(list,3);
//printf("%d\n",p->data);
//insertToIndex(list,2,67);
//iterator(list);
//delete(list);
//iterator(list);
//deleteToIndex(list,1);
//iterator(list);
//int index=searchToData(list,77);
//updateToIndex(list,index,22);
//iterator(list);
//reverse(list);
//iterator(list);
//destory(list);
//iterator(list);
//distinct(list);
//iterator(list);
//sort(list);
//iterator(list);
list->next=recursion_reverse(list->next);
iterator(list);
return 0;
}
linkList.c
#include "linkList.h"
LinkList list_create(){
LinkList list=(LinkList)malloc(sizeof(Node));
if(list==NULL){
printf("创建失败\n");
return NULL;
}
list->length=0;
list->next=NULL;
printf("链表创建成功\n");
return list;
}
LinkList apply_node(datatype e){
LinkList node=(LinkList)malloc(sizeof(Node));
if(node==NULL){
printf("创建失败\n");
return NULL;
}
node->data=e;
node->next=NULL;
printf("节点创建成功\n");
return node;
}
int is_empty(LinkList p){
return p->next==NULL;
}
int insert(LinkList head,datatype e){
if(head==NULL){
printf("链表不存在\n");
return -1;
}
LinkList node=apply_node(e);
node->next=head->next;
head->next=node;
head->length++;
printf("头插法插入成功\n");
return 0;
}
void iterator(LinkList head){
if(head==NULL||is_empty(head)){
printf("链表为空或不存在\n");
return;
}
head=head->next;
while(head!=NULL){
printf("%d\t",head->data);
head=head->next;
}
printf("\n");
}
LinkList searchToIndex(LinkList head,int index){
if(head==NULL||index<0||index>=head->length){
printf("查找失败\n");
return NULL;
}
head=head->next;
for(int i=0;i<index;i++){
head=head->next;
}
return head;
}
int insertToIndex(LinkList head,int index,datatype e){
if(head==NULL||index<0||index>head->length){
printf("插入失败\n");
return -1;
}
head->length++;
LinkList p=apply_node(e);
for(int i=0;i<index;i++){
head=head->next;
}
p->next=head->next;
head->next=p;
printf("插入成功\n");
return 0;
}
int delete(LinkList head){
if(head==NULL||is_empty(head)){
printf("删除失败\n");
return -1;
}
head->length--;
LinkList p=head->next;
head->next=p->next;
free(p);
p=NULL;
return 0;
}
int deleteToIndex(LinkList head,int index){
if(head==NULL||index<0||index>=head->length){
printf("删除失败\n");
return -1;
}
head->length--;
for(int i=0;i<index;i++){
head=head->next;
}
LinkList p=head->next;
head->next=p->next;
free(p);
p=NULL;
return 0;
}
int searchToData(LinkList head,datatype e){
if(head==NULL||is_empty(head)){
printf("查找失败\n");
return -1;
}
int index=0;
head=head->next;
while(head!=NULL){
if(head->data==e){
printf("查找成功\n");
return index;
}
head=head->next;
index++;
}
printf("数据不存在\n");
return -1;
}
int updateToIndex(LinkList head,int index,datatype e){
if(head==NULL||index<0||index>=head->length){
printf("修改失败\n");
return -1;
}
LinkList p=searchToIndex(head,index);
p->data=e;
printf("修改成功\n");
return 0;
}
int reverse(LinkList head){
if(head==NULL||is_empty(head)){
return -1;
}
LinkList p=head->next;
LinkList q=NULL;
head->next=NULL;
while(p!=NULL){
q=p->next;
p->next=head->next;
head->next=p;
p=q;
}
return 0;
}
void destory(LinkList head){
if(head==NULL){
printf("链表为空\n");
return;
}
while(head->next!=NULL){
delete(head);
}
free(head);
}
void distinct(LinkList head){
if(head==NULL||is_empty(head)){
printf("链表为空或不存在\n");
return;
}
LinkList p=head->next;
int i=1;
while(p!=NULL){
int flag=searchToData(p,p->data);
while(flag!=-1){
deleteToIndex(head,flag+i);
flag=searchToData(p,p->data);
}
p=p->next;
i++;
}
printf("去重成功\n");
}
void sort(LinkList head){
LinkList p=head->next;
LinkList q=p;
for(int i=0;i<head->length-1;i++){
for(int j=0;j<head->length-(i+1);j++){
if(q->data>q->next->data){
datatype temp= q->data;
q->data=q->next->data;
q->next->data=temp;
}
q=q->next;
}
q=p;
}
}
LinkList recursion_reverse(LinkList head){
if(head->next==NULL){
return head;
}
LinkList new_head=recursion_reverse(head->next);
head->next->next=head;
head->next=NULL;
return new_head;
}
linkList.h
#ifndef LINKLIST
#include <myhead.h>
typedef int datatype;
typedef struct Node{
union{
int length;
datatype data;
};
struct Node* next;
}Node,*LinkList;
LinkList list_create();
LinkList apply_node(datatype e);
int insert(LinkList head,datatype e);
void iterator(LinkList head);
LinkList searchToIndex(LinkList head,int index);
int insertToIndex(LinkList head,int index,datatype e);
int delete(LinkList head);
int deleteToIndex(LinkList head,int index);
int searchToData(LinkList head,datatype e);
int updateToIndex(LinkList head,int index,datatype e);
int reverse(LinkList head);
void destory(LinkList head);
void distinct(LinkList head);
void sort(LinkList head);
LinkList recursion_reverse(LinkList head);
#endif