本篇以C语言实现对链表的模拟,作为我在初学数据结构时的倔强吧!
本次模拟通过make工具(工程管理器),顾名思义,也就是多文本文件编译管理器,其特点为可以通过Makefile实现多文本编译,修改后可以通过时间戳来改变,大大提高了编译效率,而Makefile也是make的唯一的适配文件,所以本次模拟分为三个基本文件:main.c linklist.c linklist.h
下面进入正题
linklist.c
#include<stdio.h>#include<stdlib.h>#include"linklist.h"//创建链表!linklist_t *create(void){linklist_t *p;p=(linklist_t *)malloc(sizeof(linklist_t));if(p==NULL){printf("创建失败!\n");return NULL;}printf("创建成功!\n");p->next=NULL;return p;}//添加链表成员int add(linklist_t *p,int post,datatype data){linklist_t *q;q=(linklist_t *)malloc(sizeof(linklist_t));q->next=NULL;int i;for(i=0;i<post;i++){p=p->next;}q->next=p->next;p->next=q;q->data=data;printf("添加成功!\n");}//打印链表成员!int show(linklist_t *p){while(p->next!=NULL){p=p->next;printf("%d ",p->data);}printf("\n");}//判断链表是否为空!int kong(linklist_t *p){return p->next==NULL;}//确定链表长度int len(linklist_t *p){int i=0;while(p->next!=0){p=p->next;i++;}return i;}//按位置删除链表元素!int delete(linklist_t *p,int post){if(post<0||post>len(p)||kong(p)){printf("删除失败!\n");return -1;}int i;for(i=0;i<post;i++){p=p->next;}linklist_t *q;q=p->next;p->next=q->next;free(q);printf("删除成功!\n");}//按位置修改链表元素!int gai(linklist_t *p,int post,datatype new){if(post<0||post>len(p)||kong(p)){printf("按位置修改失败!\n");return -1;}int i;for(i=0;i<=post;i++){p=p->next;}p->data=new;printf("按位置修改成功!\n");}//按位置查找链表元素!int cha(linklist_t *p,int post){if(post<0||post>len(p)||kong(p)){printf("按位置查找失败!\n");return -1;}int i;for(i=0;i<=post;i++)p=p->next;printf("按位置查找成功:%d\n",p->data);}//链表反转int fanzhuan(linklist_t *p){linklist_t *q;q=p->next;linklist_t *n;int i;int a=len(p);for(i=0;i<a-1;i++){n=q;for(int l=0;l<a-i-1;l++)n=n->next;p->next=n;p=p->next;// n=NULL;// free(n);}for(i=0;i<a;i++){p=p->next;}p->next=q;q->next=NULL;}//清空链表!int qing(linklist_t *p){linklist_t *q;q=p->next;int i;for(i=0;i<len(p);i++){q=p;for(int l=0;l<len(p)-i-1;l++){q=q->next;}linklist_t *n;n=q;free(n);n->next=NULL;}//销毁列表/* free(p);p->next=NULL;*/}
main.c
#include<stdio.h>#include<stdlib.h>#include"linklist.h"int main(int argc, const char *argv[]){linklist_t *p;p=create();add(p,0,1);add(p,1,2);add(p,2,3);add(p,3,4);fanzhuan(p);show(p);delete(p,0);gai(p,1,100);cha(p,1);// free(p);qing(p);show(p);return 0;}
linklist.h
#ifndef __LINKLIST_H__#define __LINKLIST_H__typedef int datatype;typedef struct link{datatype data;struct link *next;}linklist_t;linklist_t *create(void);int add(linklist_t *p,int post,datatype data);int show(linklist_t *p);int delete(linklist_t *p,int post);int gai(linklist_t *p,int post,datatype new);int cha(linklist_t *p,int post);int fanzhuan(linklist_t *p);int qing(linklist_t *p);#endif
Makefile文件
CC=gcc
OBJS=main.o linklist.o
CFLAGS=-c -g -O
link:$(OBJS)
$(CC) $(OBJS) -o $@
%.o:%.c
$(CC) $(CFLAGS) $^ -o $@
.PHONY:clean
clean:
rm *.o link
以上为本次模拟的全部内容,如果对你有用请点个赞吧!