作业要求:
1.自己实现单向循环链表的功能
2.整理思维导图
3.复习前面顺序表和链表的代码,重写链表逆置函数
1.自己实现单向循环链表的功能
运行代码:
main.c
#include "loop_list.h"
int main(int argc, const char *argv[])
{loop_p H = creat_head();//头插1 2 3 4insert_head(H,4);insert_head(H,3);insert_head(H,2);insert_head(H,1);print(H);//按位置插insert_pos(H,5,5);insert_pos(H,2,5);print(H);//尾删del_tail(H);//按位置删除del_pos(H,2); print(H);return 0;
}
loop_list.c
#include "loop_list.h"
loop_p creat_head()
{loop_p H=(loop_p)malloc(sizeof(loop_list));if(H==NULL){printf("申请失败\n");return NULL;}H->len=0;H->next=H;return H;
}
loop_p creat_node(datatype data)
{loop_p new=(loop_p)malloc(sizeof(loop_list));if(new==NULL){printf("申请失败节点\n"); return NULL;}new->data=data;return new;
}
//头插
void insert_head(loop_p H,datatype data)
{if(H==NULL){printf("入参失败\n");return;}loop_p new=creat_node(data);new->next=H->next;H->next=new;H->len++;
}
//按位置插入
void insert_pos(loop_p H,int pos,datatype data)
{if(H==NULL){printf("入参失败\n");return;}else if(pos>H->len+1||pos<=0){printf("输入位置有误\n");printf("----\n");return;}loop_p new=creat_node(data);loop_p p=H;for(int i=1;i<pos;i++){p=p->next; }//p在pos位前一位new->next=p->next;p->next=new;H->len++;}
//尾删
void del_tail(loop_p H)
{if(NULL==H){printf("入参失败\n");return;}if(H==H->next){printf("数据为空\n");return;}loop_p p=H->next;while((p->next)->next!=H){p=p->next;}free(p->next);p->next=H;H->len--;}
//按位置删除
void del_pos(loop_p H,int pos)
{if(NULL==H){printf("入参失败\n");return;}if(H==H->next){printf("数据为空\n");return;}else if(pos<=0||pos>=H->len){printf("位置输入有误\n");}loop_p p=H;//指向第一个数据for(int i=1;i<pos;i++){p=p->next;}loop_p temp=p->next->next;free(p->next);p->next=temp;}
//输出
void print(loop_p H)
{if(NULL==H){printf("打印入参失败\n");return;}loop_p p=H->next;
//循环输出两次for(int i=0;i<N;i++){while(p!=H){printf("%d->",p->data);p=p->next;}p=p->next;}putchar(10);
}
loop_list.h
#ifndef __LOOP_LIST_H__
#define __LOOP_LIST_H__#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#define N 2
typedef int datatype;
typedef struct loop_list
{union{int len;datatype data;};struct loop_list *next;
}loop_list,*loop_p;//创建单向循环链表
loop_p creat_head();
//创建结点
loop_p creat_node(datatype data);
//头插
void insert_head(loop_p H,datatype data);
//按位置插入
void insert_pos(loop_p H,int pos,datatype data);
//尾删
void del_tail(loop_p H);
//按位置删除
void del_pos(loop_p H,int pos);
//输出
void print(loop_p H);
#endif
运行截图:
3.复习前面顺序表和链表的代码,重写链表逆置函数
运行代码:
void overturn_link(link_p H)
{
#if 0 分配了新空间for(int i=0;i<H->len;i++){insert_pos(H,H->len-i+1,(H->next)->data);del_head(H);}
#endif
#if 1 link_p p=H->next->next;H->next->next=NULL;link_p q=p->next;while(NULL!=p){p->next=H->next;H->next=p;p=q;if(q!=NULL){q=q->next;}}
#endif}
运行截图: