单向循环链表
头插法、尾删法、头删法、尾插法、按位插入、按位删除、遍历。
linklist_main.c文件
#include <stdio.h> #include <stdlib.h> #include "./linklistfunc.h" int main(int argc, const char *argv[]) { loopLinklist* head =create_looplinklist(); //尾插法 insert_linklist(head,100); insert_linklist(head,90); insert_linklist(head,80); show_linklist(head); //头插法 insertbyfront_linklist(head,30); insertbyfront_linklist(head,40); show_linklist(head); //头删法 deletebyfront_linklist(head); show_linklist(head); //尾删法 deletebyrear_linklist(head); show_linklist(head); //按位置插入(Bitwise按位) insert_linklistBitwise(head,10,2); show_linklist(head); //按位置删除 delete_linklistBitwise(head,2); show_linklist(head); return 0; }
linklistfunc.c文件
#include <stdio.h> #include <stdlib.h> #include "./linklistfunc.h" loopLinklist* create_looplinklist(void) { //*phead代表访问了phead指向的那块空间 loopLinklist* head = (loopLinklist*)malloc(sizeof(loopLinklist)); if(NULL == head) { printf("单向循环链表创建失败\n"); return NULL; } head->text.len =0; head->next = head; return head; } //尾插法 void insert_linklist(loopLinklist *head,datatype num) { //创建一个新的结点 loopLinklist* temp = (loopLinklist*)malloc(sizeof(loopLinklist)); if(NULL==temp) { printf("创建结点失败,尾插失败\n"); return; } temp->text.data = num; temp->next= NULL; //找到尾节点p的值 loopLinklist *p =head; while(p->next != head) { p=p->next; } temp->next=p->next; p->next=temp; //更新链表的长度 head->text.len++; return; } //头插法 void insertbyfront_linklist(loopLinklist *head,datatype num) { //创建一个新的结点 loopLinklist* temp = (loopLinklist*)malloc(sizeof(loopLinklist)); if(NULL==temp) { printf("创建结点失败,头插失败\n"); return; } temp->text.data = num; temp->next= NULL; temp->next = head->next; head->next=temp; //更新结点链表长度 head->text.len++; return ; } //头删法 datatype deletebyfront_linklist(loopLinklist *head) { if(head->next==head) { printf("链表为空,删除失败\n"); return (datatype)-1; } //备份需要删除的结点 loopLinklist* temp = head->next; head->next=temp->next; datatype num = temp->text.data; free(temp); //更新结点链表长度 head->text.len--; return num; } //尾删法 datatype deletebyrear_linklist(loopLinklist* head) { if(head->next==head) { printf("链表为空,删除失败\n"); return (datatype)-1; } //遍历找到倒数第二个结点,删除倒数第一个结点 loopLinklist* p = head; while(p->next->next != head) { p = p->next; } loopLinklist* temp = p->next; p->next=p->next->next; datatype num = temp->text.data; free(temp); //更新结点链表长度 head->text.len--; return num; } //按位置插入(Bitwise按位) void insert_linklistBitwise(loopLinklist* head,datatype num,int n) { //判断插入的位置是否合法 if(n<1 || n>head->text.len+1) { printf("插入位置非法\n"); } //向第n个位置插入,则需要找到第n-1个位置插入 //若在找的途中,p指向NULL,则代表插入位置非法 loopLinklist *p = head; for(int i=0;i<n-1;i++) { p=p->next; if(NULL == p) { printf("插入位置非法\n"); return ; } } //先创建结点 loopLinklist* temp =(loopLinklist*)malloc(sizeof(loopLinklist)); if(NULL == temp) { printf("创建结点失败,按位置插入失败\n"); return ; } temp->text.data = num;//数据域赋值 temp->next = NULL;//指针域赋值 temp->next=p->next; p->next = temp; //更新头结点中链表的长度 head->text.len++; return ; } //按位置删除 void delete_linklistBitwise(loopLinklist* head,int n) { //判断链表是否为空 if(NULL ==head->next) { printf("链表为空,删除失败\n"); return ; } //判断删除位置是否合法 if(n<1) { printf("删除位置非法\n"); return; } //找到要删除的位置的前一个结点位置 //删除第n个位置,则需要找到第n-1个位置 loopLinklist *p = head; for(int i=0;i<n-1;i++) { p=p->next; if(p->next == NULL) { printf("当前插入的位置非法\n"); return ; } } //p指向的是要删除的结点的前一个位置 loopLinklist* temp=p->next; p->next=temp->next; free(temp); temp=NULL; //更新头结点中链表的长度 head->text.len--; return ; } //遍历链表 void show_linklist(loopLinklist*head) { loopLinklist* p =head; while(p->next != head) { p=p->next; printf("%d ",p->text.data); } putchar(10); return ; }
linklistfunc.h文件
#ifndef __LINKLIST__ #define __LINKLIST__ typedef int datatype; //结构体 typedef struct looplklist { union { int len;//若是头结点,则是用len存储链表长度 datatype data;//若是有效数据结点,则用data存放有效数据 }text;//数据域 struct looplklist* next;//指针域 }loopLinklist; loopLinklist* create_looplinklist(void); //尾插法 void insert_linklist(loopLinklist *head,datatype num); //遍历链表 void show_linklist(loopLinklist*head); //头插法 void insertbyfront_linklist(loopLinklist *head,datatype num); //头删法 datatype deletebyfront_linklist(loopLinklist *head); //尾删法 datatype deletebyrear_linklist(loopLinklist* head); //按位置插入(Bitwise按位) void insert_linklistBitwise(loopLinklist* head,datatype num,int n); //按位置删除 void delete_linklistBitwise(loopLinklist* head,int n); #endif
嵌入式-单向循环链表
最新推荐文章于 2024-11-02 20:41:42 发布