Chapter 3(线性表)
//单链表代码,手打纯手工
//***********************************link.h***********************************
#ifndef LINK_H
#define LINK_H
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct link
{
datatype data;
struct link *next;
}Node,*Link;
//创建单链表
Link linkCreate();
//获得链表长度
size_t length(Link link);
//判断链表是否为空
bool isEmpty(Link link);
//获得第i个前的地址
Node *addressFront(Link link,size_t i);
//获取第i个节点的值
datatype getElement(Link link,size_t i);
//查找元素num是否存在
bool isExist(Link link,datatype num);
//插入元素
bool insert(Link link,size_t i,datatype num);
//在链表头插入元素
bool pushFront(Link link,datatype num);
//在链表尾插入元素
bool pushBack(Link link,datatype num);
//删除第i个元素
bool deleteI(Link link,size_t i);
//删除包含元素num的第一个节点
bool deleteNum(Link link,datatype num);
//遍历打印整个链表
void travel(Link link);
//清空链表
bool clear(Link link);
//销毁链表
bool destroy(Link link);
//链表翻转
bool reverse(Link link);
//链表指定长度反转
void reverseN(Link link,int n);
#endif //LINK_H
//*************************link.c****************************************
#include "link.h"
//创建单链表头
Link linkCreate()
{
Node *p = (Node *)malloc(sizeof(Node));
p->next = NULL;
return p;
}
//获得链表长度
size_t length(Link link)
{
size_t count = 0;
Node *node = link->next;
while(node)
{
count++;
node = node->next;
}
return count;
}
//判断链表是否为空
bool isEmpty(Link link)
{
if(NULL == link->next)return true;
return false;
}
//获得第i个前的地址,供内部使用
Node *addressFront(Link link,size_t i)
{
if(NULL == link)return NULL;//头节点为空,返回NULL
if(i > (length(link)+1))return NULL;//i越界,len+1是可取的,相当于最后加上这个数,i不能为0.返回于NULL
if(isEmpty(link))return link;//当链表为空时,返回头节点地址
Node *pre = link; //保存前一个节点的地址
Node *curr = link->next;
for(size_t j = 1;j < i;j++)
{
pre = curr;
curr = curr->next;
}
return pre;
}
//获取第i个节点的值
datatype getElement(Link link,size_t i)
{
Node *node = addressFront(link,i);
return node->next->data;
}
//查找元素num是否存在
bool isExist(Link link,datatype num)
{
if(NULL == link)return false;
Node *node = link->next;
while(node)
{
if(num == node->data)return true;
node = node->next;
}
return false;
}
//插入元素
bool insert(Link link,size_t i,datatype num)
{
if(NULL == link)return false;
if(i > (length(link)+1)||i <= 0)return false;
Node *pre = addressFront(link,i);//获得第i-1个节点的地址
Node *node = (Node *)malloc(sizeof(Node));//申请内存存放新节点
Node *save = pre->next; //将原来的第i个节点的地址保存在save中
pre->next = node; //将原来的第i-1个节点指向新节点
node->data = num; //为新节点的数据域赋值
node->next = save;//将新节点指向原来的第i个节点
return true;
}
//在链表头插入元素
bool pushFront(Link link,datatype num)
{
return insert(link,1,num);
}
//在链表尾插入元素
bool pushBack(Link link,datatype num)
{
return insert(link,length(link)+1,num);
}
//删除第i个元素
bool deleteI(Link link,size_t i)
{
if(NULL == link)return false;
if(i>length(link) || i<=0)return false;
Node *pre = addressFront(link,i);
Node *node= pre->next;
pre->next = node->next;
free(node);
node = NULL;
return true;
}
//删除包含元素num的第一个节点
bool deleteNum(Link link,datatype num)
{
if(NULL == link)return false;
Node *pre = link;
Node *curr = link->next;
while(curr)
{
if(num == curr->data)
{
pre->next = curr->next;
free(curr);
curr = NULL;
return true;
}
pre = curr;
curr= curr->next;
}
return false;
}
//遍历打印整个链表
void travel(Link link)
{
if(NULL == link)return;
Node *node = link->next;
while(node)
{
printf("%d ",node->data);
node = node->next;
}
printf("\n");
}
//清空链表
bool clear(Link link)
{
if(NULL == link)return false;
Node *node = link->next;//从头节点开始释放
while(node)
{
Node *temp = node->next;//保存下一个节点的地址
free(node);//释放当前节点
node = temp;//将下一个节点地址赋给node
}
link->next = NULL;//头节点指向空
return true;
}
//销毁链表
bool destroy(Link link)
{
if(NULL == link)return false;
clear(link);
free(link);
link = NULL;
return true;
}
//链表翻转
bool reverse(Link link)
{
if(NULL == link)return false;
Node *pre = link->next;
Node *curr= pre->next;
while(curr)
{
Node *temp = curr->next;//保存当前节点的下一个节点地址
curr->next = pre;//将当前节点指向上一个节点
pre = curr;//将上一个节点指向当前节点
curr= temp;//将当前节点指向喜爱一个节点
}
link->next->next = NULL;//将原来第一个节点指向空
link->next = pre;//将头节点指向原来的最后一个节点
return true;
}
//链表指定长度反转工具
void reverseTool(Node *prev,Node *curr,int num)
{
if(NULL == curr)return;
Node *prevNode = curr;
Node *currNode = curr->next;
int count = 1;
while(currNode)
{
Node *nextNode = currNode->next;
currNode->next = prevNode;
prevNode = currNode;
currNode = nextNode;
count++;
if(num == count)
{
Node *temp = prev->next;
prev->next->next =currNode;
prev->next = prevNode;
reverseTool(temp,currNode,num);
return;
}
}
prev->next->next = currNode;
prev->next = prevNode;
}
//链表指定长度反转
void reverseN(Link link,int n)
{
Node *node = link->next;
reverseTool(link,node,n);
}
//************************linkTest.c*****************************************
#include "link.h"
int main(int argc,char *argv[])
{
Link head = linkCreate();
travel(head);
insert(head,1,77);
travel(head);
insert(head,1,777);
travel(head);
insert(head,3,7777);
travel(head);
printf("length = %d\n",length(head));
pushFront(head,52);
travel(head);
printf("length = %d\n",length(head));
pushBack(head,00);
travel(head);
printf("length = %d\n",length(head));
//deleteNum(head,777);
//deleteI(head,2);
travel(head);
printf("length = %d\n",length(head));
printf("-----\n");
reverseN(head,2);
//clear(head);
travel(head);
return 0;
}
//单链表代码,手打纯手工
//***********************************link.h***********************************
#ifndef LINK_H
#define LINK_H
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct link
{
datatype data;
struct link *next;
}Node,*Link;
//创建单链表
Link linkCreate();
//获得链表长度
size_t length(Link link);
//判断链表是否为空
bool isEmpty(Link link);
//获得第i个前的地址
Node *addressFront(Link link,size_t i);
//获取第i个节点的值
datatype getElement(Link link,size_t i);
//查找元素num是否存在
bool isExist(Link link,datatype num);
//插入元素
bool insert(Link link,size_t i,datatype num);
//在链表头插入元素
bool pushFront(Link link,datatype num);
//在链表尾插入元素
bool pushBack(Link link,datatype num);
//删除第i个元素
bool deleteI(Link link,size_t i);
//删除包含元素num的第一个节点
bool deleteNum(Link link,datatype num);
//遍历打印整个链表
void travel(Link link);
//清空链表
bool clear(Link link);
//销毁链表
bool destroy(Link link);
//链表翻转
bool reverse(Link link);
//链表指定长度反转
void reverseN(Link link,int n);
#endif //LINK_H
//*************************link.c****************************************
#include "link.h"
//创建单链表头
Link linkCreate()
{
Node *p = (Node *)malloc(sizeof(Node));
p->next = NULL;
return p;
}
//获得链表长度
size_t length(Link link)
{
size_t count = 0;
Node *node = link->next;
while(node)
{
count++;
node = node->next;
}
return count;
}
//判断链表是否为空
bool isEmpty(Link link)
{
if(NULL == link->next)return true;
return false;
}
//获得第i个前的地址,供内部使用
Node *addressFront(Link link,size_t i)
{
if(NULL == link)return NULL;//头节点为空,返回NULL
if(i > (length(link)+1))return NULL;//i越界,len+1是可取的,相当于最后加上这个数,i不能为0.返回于NULL
if(isEmpty(link))return link;//当链表为空时,返回头节点地址
Node *pre = link; //保存前一个节点的地址
Node *curr = link->next;
for(size_t j = 1;j < i;j++)
{
pre = curr;
curr = curr->next;
}
return pre;
}
//获取第i个节点的值
datatype getElement(Link link,size_t i)
{
Node *node = addressFront(link,i);
return node->next->data;
}
//查找元素num是否存在
bool isExist(Link link,datatype num)
{
if(NULL == link)return false;
Node *node = link->next;
while(node)
{
if(num == node->data)return true;
node = node->next;
}
return false;
}
//插入元素
bool insert(Link link,size_t i,datatype num)
{
if(NULL == link)return false;
if(i > (length(link)+1)||i <= 0)return false;
Node *pre = addressFront(link,i);//获得第i-1个节点的地址
Node *node = (Node *)malloc(sizeof(Node));//申请内存存放新节点
Node *save = pre->next; //将原来的第i个节点的地址保存在save中
pre->next = node; //将原来的第i-1个节点指向新节点
node->data = num; //为新节点的数据域赋值
node->next = save;//将新节点指向原来的第i个节点
return true;
}
//在链表头插入元素
bool pushFront(Link link,datatype num)
{
return insert(link,1,num);
}
//在链表尾插入元素
bool pushBack(Link link,datatype num)
{
return insert(link,length(link)+1,num);
}
//删除第i个元素
bool deleteI(Link link,size_t i)
{
if(NULL == link)return false;
if(i>length(link) || i<=0)return false;
Node *pre = addressFront(link,i);
Node *node= pre->next;
pre->next = node->next;
free(node);
node = NULL;
return true;
}
//删除包含元素num的第一个节点
bool deleteNum(Link link,datatype num)
{
if(NULL == link)return false;
Node *pre = link;
Node *curr = link->next;
while(curr)
{
if(num == curr->data)
{
pre->next = curr->next;
free(curr);
curr = NULL;
return true;
}
pre = curr;
curr= curr->next;
}
return false;
}
//遍历打印整个链表
void travel(Link link)
{
if(NULL == link)return;
Node *node = link->next;
while(node)
{
printf("%d ",node->data);
node = node->next;
}
printf("\n");
}
//清空链表
bool clear(Link link)
{
if(NULL == link)return false;
Node *node = link->next;//从头节点开始释放
while(node)
{
Node *temp = node->next;//保存下一个节点的地址
free(node);//释放当前节点
node = temp;//将下一个节点地址赋给node
}
link->next = NULL;//头节点指向空
return true;
}
//销毁链表
bool destroy(Link link)
{
if(NULL == link)return false;
clear(link);
free(link);
link = NULL;
return true;
}
//链表翻转
bool reverse(Link link)
{
if(NULL == link)return false;
Node *pre = link->next;
Node *curr= pre->next;
while(curr)
{
Node *temp = curr->next;//保存当前节点的下一个节点地址
curr->next = pre;//将当前节点指向上一个节点
pre = curr;//将上一个节点指向当前节点
curr= temp;//将当前节点指向喜爱一个节点
}
link->next->next = NULL;//将原来第一个节点指向空
link->next = pre;//将头节点指向原来的最后一个节点
return true;
}
//链表指定长度反转工具
void reverseTool(Node *prev,Node *curr,int num)
{
if(NULL == curr)return;
Node *prevNode = curr;
Node *currNode = curr->next;
int count = 1;
while(currNode)
{
Node *nextNode = currNode->next;
currNode->next = prevNode;
prevNode = currNode;
currNode = nextNode;
count++;
if(num == count)
{
Node *temp = prev->next;
prev->next->next =currNode;
prev->next = prevNode;
reverseTool(temp,currNode,num);
return;
}
}
prev->next->next = currNode;
prev->next = prevNode;
}
//链表指定长度反转
void reverseN(Link link,int n)
{
Node *node = link->next;
reverseTool(link,node,n);
}
//************************linkTest.c*****************************************
#include "link.h"
int main(int argc,char *argv[])
{
Link head = linkCreate();
travel(head);
insert(head,1,77);
travel(head);
insert(head,1,777);
travel(head);
insert(head,3,7777);
travel(head);
printf("length = %d\n",length(head));
pushFront(head,52);
travel(head);
printf("length = %d\n",length(head));
pushBack(head,00);
travel(head);
printf("length = %d\n",length(head));
//deleteNum(head,777);
//deleteI(head,2);
travel(head);
printf("length = %d\n",length(head));
printf("-----\n");
reverseN(head,2);
//clear(head);
travel(head);
return 0;
}
//静态链表代码,纯手打
//********************static_link.h***********************
#ifndef STATIC_LINK_H
#define STATIC_LINK_H
#include <stdio.h>
#include <stdbool.h>
#define MAXSIZE 1000
typedef int datatype;
typedef struct Static_linklist
{
datatype data;
int curr;
}Node,static_link[MAXSIZE];
//初始化静态链表
bool InitList(static_link link);
//获取链表长度
size_t length(static_link link);
//Malloc_SLL若备用链表非空,则返回分配的节点下标,否则返回0
int Malloc_SLL(static_link link);
//Free_SSL将下标为K的空闲节点回收到备用链表
void Free_SSL(static_link link,int k);
//插入元素
bool insert(static_link link,int i,datatype num);
//删除元素
bool Delete(static_link link,int i );
//判断链表是否为空
bool isEmpty(static_link link);
//获取第i个对象的值
datatype getElement(static_link link,int i);
//历遍整个链表
void travel(static_link link);
#endif //STATIC_LINK_H
//********************static_link.c***********************
#include "static_link.h"
//初始化静态链表
bool InitList(static_link link)
{
if(NULL == link)return false;
for(int i = 0;i < MAXSIZE-1;i++)
{
link[i].curr = i+1;
}
link[MAXSIZE-1].curr = 0;
return true;
}
//获取链表长度
size_t length(static_link link)
{
if(NULL == link)return false;
size_t index = link[MAXSIZE-1].curr;
size_t count = 0;
while(index)
{
count++;
index = link[index].curr;
}
return count;
}
//Malloc_SLL若备用链表非空,则返回分配的节点下标,否则返回0
int Malloc_SLL(static_link link)
{
if(0 == link[0].curr)return 0;
int result = link[0].curr;
link[0].curr = link[link[0].curr].curr;
return result;
}
//Free_SSL将下标为K的空闲节点回收到备用链表
void Free_SSL(static_link link,int k)
{
link[k].curr = link[0].curr;
link[0].curr = k;
}
//插入元素
bool insert(static_link link,int i,datatype num)
{
if(i<1 || i > length(link)+1)return false; //当输入的i小于1或者比链表长度+1大,则非法。
int index = Malloc_SLL(link);
if(index)
{
link[index].data = num;
int index_front = MAXSIZE-1;
for(int j = 1;j < i;j++)
{
index_front = link[index_front].curr;
}
link[index].curr = link[index_front].curr;
link[index_front].curr = index;
return true;
}
return false;
}
//删除元素
bool Delete(static_link link,int i )
{
if(i<1 || i > length(link))return false;
size_t index = MAXSIZE-1;
for(int j =1;j < i;j++)
{
index = link[index].curr;
}
size_t tmp = link[index].curr;
link[index].curr = link[tmp].curr;
Free_SSL(link,i);
return true;
}
//判断链表是否为空
bool isEmpty(static_link link)
{
return !link[MAXSIZE-1].curr;
}
//获取第i个对象的值
datatype getElement(static_link link,int i)
{
if(i<1 || i>length(link))return ~(1<<(sizeof(datatype)*8-1))+1;//这里由于函数的返回值是数据类型,因此不能返回false来报告输入错误,因此后面取了这个数据类型的最大值+1输出表示输入下标不合法
size_t index = link[MAXSIZE-1].curr;
for(size_t j = 1;j < i;j++)
{
index = link[index].curr;
}
return link[index].data;
}
//历遍整个链表
void travel(static_link link)
{
size_t index = link[MAXSIZE-1].curr;
while(index)
{
printf("%d ",link[index].data);
index = link[index].curr;
}
printf("\n");
}
//********************static_linkTest.c***********************
#include "static_link.h"
int main()
{
Node arr[MAXSIZE];
InitList(arr);
printf("isEmpty: %d \n",isEmpty(arr));
travel(arr);
insert(arr,1,77);
insert(arr,2,25);
printf("isEmpty: %d \n",isEmpty(arr));
travel(arr);
//Delete(arr,2);
//travel(arr);
//printf("isEmpty: %d \n",isEmpty(arr));
printf("arr[2]:%d \n",getElement(arr,2));
printf("arr[3]:%d \n",getElement(arr,3));
return 0;
}
//静态链表代码,纯手打
//********************static_link.h***********************
#ifndef STATIC_LINK_H
#define STATIC_LINK_H
#include <stdio.h>
#include <stdbool.h>
#define MAXSIZE 1000
typedef int datatype;
typedef struct Static_linklist
{
datatype data;
int curr;
}Node,static_link[MAXSIZE];
//初始化静态链表
bool InitList(static_link link);
//获取链表长度
size_t length(static_link link);
//Malloc_SLL若备用链表非空,则返回分配的节点下标,否则返回0
int Malloc_SLL(static_link link);
//Free_SSL将下标为K的空闲节点回收到备用链表
void Free_SSL(static_link link,int k);
//插入元素
bool insert(static_link link,int i,datatype num);
//删除元素
bool Delete(static_link link,int i );
//判断链表是否为空
bool isEmpty(static_link link);
//获取第i个对象的值
datatype getElement(static_link link,int i);
//历遍整个链表
void travel(static_link link);
#endif //STATIC_LINK_H
//********************static_link.c***********************
#include "static_link.h"
//初始化静态链表
bool InitList(static_link link)
{
if(NULL == link)return false;
for(int i = 0;i < MAXSIZE-1;i++)
{
link[i].curr = i+1;
}
link[MAXSIZE-1].curr = 0;
return true;
}
//获取链表长度
size_t length(static_link link)
{
if(NULL == link)return false;
size_t index = link[MAXSIZE-1].curr;
size_t count = 0;
while(index)
{
count++;
index = link[index].curr;
}
return count;
}
//Malloc_SLL若备用链表非空,则返回分配的节点下标,否则返回0
int Malloc_SLL(static_link link)
{
if(0 == link[0].curr)return 0;
int result = link[0].curr;
link[0].curr = link[link[0].curr].curr;
return result;
}
//Free_SSL将下标为K的空闲节点回收到备用链表
void Free_SSL(static_link link,int k)
{
link[k].curr = link[0].curr;
link[0].curr = k;
}
//插入元素
bool insert(static_link link,int i,datatype num)
{
if(i<1 || i > length(link)+1)return false; //当输入的i小于1或者比链表长度+1大,则非法。
int index = Malloc_SLL(link);
if(index)
{
link[index].data = num;
int index_front = MAXSIZE-1;
for(int j = 1;j < i;j++)
{
index_front = link[index_front].curr;
}
link[index].curr = link[index_front].curr;
link[index_front].curr = index;
return true;
}
return false;
}
//删除元素
bool Delete(static_link link,int i )
{
if(i<1 || i > length(link))return false;
size_t index = MAXSIZE-1;
for(int j =1;j < i;j++)
{
index = link[index].curr;
}
size_t tmp = link[index].curr;
link[index].curr = link[tmp].curr;
Free_SSL(link,i);
return true;
}
//判断链表是否为空
bool isEmpty(static_link link)
{
return !link[MAXSIZE-1].curr;
}
//获取第i个对象的值
datatype getElement(static_link link,int i)
{
if(i<1 || i>length(link))return ~(1<<(sizeof(datatype)*8-1))+1;//这里由于函数的返回值是数据类型,因此不能返回false来报告输入错误,因此后面取了这个数据类型的最大值+1输出表示输入下标不合法
size_t index = link[MAXSIZE-1].curr;
for(size_t j = 1;j < i;j++)
{
index = link[index].curr;
}
return link[index].data;
}
//历遍整个链表
void travel(static_link link)
{
size_t index = link[MAXSIZE-1].curr;
while(index)
{
printf("%d ",link[index].data);
index = link[index].curr;
}
printf("\n");
}
//********************static_linkTest.c***********************
#include "static_link.h"
int main()
{
Node arr[MAXSIZE];
InitList(arr);
printf("isEmpty: %d \n",isEmpty(arr));
travel(arr);
insert(arr,1,77);
insert(arr,2,25);
printf("isEmpty: %d \n",isEmpty(arr));
travel(arr);
//Delete(arr,2);
//travel(arr);
//printf("isEmpty: %d \n",isEmpty(arr));
printf("arr[2]:%d \n",getElement(arr,2));
printf("arr[3]:%d \n",getElement(arr,3));
return 0;
}
//******************************circular_link.h**************************************
#ifndef CIRCULAR_LINK_H
#define CIRCULAR_LINK_H
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef int datatype;
typedef struct circular_link
{
datatype data;
struct circular_link *next;
}Node,*Link;
//创建链表
Link create();
//获取链表长度
size_t length(Link link);
//获取第i-1个节点的地址,工具函数内部使用
Node *addressTool(Link link,size_t i);
//插入节点
bool insert(Link link,size_t i,datatype data);
//删除节点
bool Delete(Link link,size_t i);
//历遍节点
void travel(Link link);
//判断节点是否为空
bool isEmpty(Link link);
//获取第i个节点的数据
datatype getElement(Link link,size_t i);
#endif //CIRCULAR_LINK_H
//******************************circular_link.c**************************************
#include "circular_link.h"
//创建链表 创建失败返回NULL
Link create()
{
Link link = (Link)malloc(sizeof(Node));
link->next = link;
return link;
}
//获取链表长度
size_t length(Link link)
{
if(NULL==link || NULL==link->next)return false;
Node *node = link->next;
int count = 0;
while(node != link)
{
count++;
node = node->next;
}
return count;
}
//获取第i-1个节点的地址,工具函数内部使用
Node *addressTool(Link link,size_t i)
{
Node *node = link;
for(size_t j = 1;j < i;j++)
{
node = node->next;
}
return node;
}
//插入节点
bool insert(Link link,size_t i,datatype data)
{
if(i<1 || i > length(link)+1)return false;
if(NULL == link)return false;
Node *prev = addressTool(link,i);//获取第i-1个节点地址
Node *curr = prev->next;//获取第i个节点地址
Node *node = (Node *)malloc(sizeof(Node));//创建新节点
node->data = data;
prev->next = node;
node->next = curr;
return true;
}
//删除节点
bool Delete(Link link,size_t i)
{
if(i<1 || i>length(link))return false;
if(NULL == link)return false;
Node *prev = addressTool(link,i);
Node *curr = prev->next;
Node *temp = curr->next;
prev->next = temp;
free(curr);
curr = NULL;
return true;
}
//历遍节点
void travel(Link link)
{
Node *node = link->next;
while(node != link)
{
printf("%d ",node->data);
node = node->next;
}
printf("\n");
}
//判断节点是否为空
bool isEmpty(Link link)
{
return link->next == link;
}
//获取第i个节点的数据
datatype getElement(Link link,size_t i)
{
if(i<1 || i > length(link) || NULL == link)return !(1<<(sizeof(datatype)-1))+1;
Node *node = link->next;
for(size_t j = 1;j < i;j++)
{
node = node->next;
}
return node->data;
}
//******************************circular_linkTest.c**************************************
#include "circular_link.h"
int main()
{
Link head = create();
printf("isEmpty: %d \n",isEmpty(head));
printf("%d \n",length(head));
travel(head);
insert(head,1,77);
travel(head);
printf("isEmpty: %d \n",isEmpty(head));
insert(head,1,52);
insert(head,1,44);
travel(head);
printf("%d \n",length(head));
printf("head:1:%d \n",getElement(head,1));
printf("head:2:%d \n",getElement(head,2));
printf("head:3:%d \n",getElement(head,3));
// Delete(head,1);
// travel(head);
// Delete(head,1);
// travel(head);
// Delete(head,1);
// travel(head);
return 0;
}
//******************************circular_link.h**************************************
#ifndef CIRCULAR_LINK_H
#define CIRCULAR_LINK_H
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef int datatype;
typedef struct circular_link
{
datatype data;
struct circular_link *next;
}Node,*Link;
//创建链表
Link create();
//获取链表长度
size_t length(Link link);
//获取第i-1个节点的地址,工具函数内部使用
Node *addressTool(Link link,size_t i);
//插入节点
bool insert(Link link,size_t i,datatype data);
//删除节点
bool Delete(Link link,size_t i);
//历遍节点
void travel(Link link);
//判断节点是否为空
bool isEmpty(Link link);
//获取第i个节点的数据
datatype getElement(Link link,size_t i);
#endif //CIRCULAR_LINK_H
//******************************circular_link.c**************************************
#include "circular_link.h"
//创建链表 创建失败返回NULL
Link create()
{
Link link = (Link)malloc(sizeof(Node));
link->next = link;
return link;
}
//获取链表长度
size_t length(Link link)
{
if(NULL==link || NULL==link->next)return false;
Node *node = link->next;
int count = 0;
while(node != link)
{
count++;
node = node->next;
}
return count;
}
//获取第i-1个节点的地址,工具函数内部使用
Node *addressTool(Link link,size_t i)
{
Node *node = link;
for(size_t j = 1;j < i;j++)
{
node = node->next;
}
return node;
}
//插入节点
bool insert(Link link,size_t i,datatype data)
{
if(i<1 || i > length(link)+1)return false;
if(NULL == link)return false;
Node *prev = addressTool(link,i);//获取第i-1个节点地址
Node *curr = prev->next;//获取第i个节点地址
Node *node = (Node *)malloc(sizeof(Node));//创建新节点
node->data = data;
prev->next = node;
node->next = curr;
return true;
}
//删除节点
bool Delete(Link link,size_t i)
{
if(i<1 || i>length(link))return false;
if(NULL == link)return false;
Node *prev = addressTool(link,i);
Node *curr = prev->next;
Node *temp = curr->next;
prev->next = temp;
free(curr);
curr = NULL;
return true;
}
//历遍节点
void travel(Link link)
{
Node *node = link->next;
while(node != link)
{
printf("%d ",node->data);
node = node->next;
}
printf("\n");
}
//判断节点是否为空
bool isEmpty(Link link)
{
return link->next == link;
}
//获取第i个节点的数据
datatype getElement(Link link,size_t i)
{
if(i<1 || i > length(link) || NULL == link)return !(1<<(sizeof(datatype)-1))+1;
Node *node = link->next;
for(size_t j = 1;j < i;j++)
{
node = node->next;
}
return node->data;
}
//******************************circular_linkTest.c**************************************
#include "circular_link.h"
int main()
{
Link head = create();
printf("isEmpty: %d \n",isEmpty(head));
printf("%d \n",length(head));
travel(head);
insert(head,1,77);
travel(head);
printf("isEmpty: %d \n",isEmpty(head));
insert(head,1,52);
insert(head,1,44);
travel(head);
printf("%d \n",length(head));
printf("head:1:%d \n",getElement(head,1));
printf("head:2:%d \n",getElement(head,2));
printf("head:3:%d \n",getElement(head,3));
// Delete(head,1);
// travel(head);
// Delete(head,1);
// travel(head);
// Delete(head,1);
// travel(head);
return 0;
}
//**********************************double_link.h************************************
#ifndef DOUBLE_LINK_H
#define DOUBLE_LINK_H
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef int datatype;
typedef struct double_link
{
datatype data;
struct double_link *prior;
struct double_link *next;
}DulNode,*DulLink;
//创建链表
DulLink create();
//链表长度
size_t length(DulLink link);
//链表是否为空
bool isEmpty(DulLink link);
//获取第i-1和节点的地址,工具函数,内部使用
DulNode *addressTool(DulLink link,size_t i);
//插入节点
bool insert(DulLink link,size_t i,datatype data);
//删除节点
bool Delete(DulLink link,size_t i);
//历遍节点
void travel(DulLink link);
#endif //DOUBLE_LINK_H
//**********************************double_link.c************************************
#include "double_link.h"
//创建双向循环链表
DulLink create()
{
DulLink link = (DulLink)malloc(sizeof(DulNode));
link->prior = link;
link->next = link;
return link;
}
//链表长度
size_t length(DulLink link)
{
if(NULL == link)return 0;
DulNode *node = link->next;
size_t count = 0;
while(node != link)
{
count++;
node = node->next;
}
return count;
}
//链表是否为空
bool isEmpty(DulLink link)
{
return (link->next == link);
}
//获取第i-1和节点的地址,工具函数,内部使用
DulNode *addressTool(DulLink link,size_t i)
{
DulNode *prev = link;
for(int j = 1;j < i;j++)
{
prev = prev->next;
}
return prev;
}
//插入节点
bool insert(DulLink link,size_t i,datatype data)
{
if(i<1 || i > length(link)+1)return false;
if(NULL == link)return false;
DulNode *prev = addressTool(link,i);//获得第i-1个节点的地址
DulNode *old = prev->next;//获得原来第i个地址
DulNode *node = (DulNode *)malloc(sizeof(DulNode));//创建新节点
node->data = data;
prev->next = node; //新节点与prev节点的连接
node->prior= prev;
node->next = old;
old->prior = node;
return true;
}
//删除节点
bool Delete(DulLink link,size_t i)
{
if(i<1 || i>length(link))return false;
if(NULL == link)return false;
DulNode *prev = addressTool(link,i);//获取第i-1个节点地址
DulNode *curr = prev->next;
DulNode *behind = curr->next;
prev->next = behind;//将第i-1个节点和i+1个节点连接起来
behind->prior = prev;
free(curr);//释放第i个节点
curr = NULL;
return true;
}
//历遍节点
void travel(DulLink link)
{
DulNode *node = link->next;
while(node != link)
{
printf("%d ",node->data);
node = node->next;
}
printf("\n");
}
//**********************************double_linkTest.c************************************
#include "double_link.h"
int main()
{
DulLink head = create();
printf("length: %d \n",length(head));
printf("isEmpty: %d \n",isEmpty(head));
insert(head,1,77);
travel(head);
insert(head,1,52);
travel(head);
insert(head,3,1314);
travel(head);
insert(head,1,74);
insert(head,1,75);
travel(head);
Delete(head,2);
travel(head);
Delete(head,1);
travel(head);
return 0;
}
x
//**********************************double_link.h************************************
#ifndef DOUBLE_LINK_H
#define DOUBLE_LINK_H
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef int datatype;
typedef struct double_link
{
datatype data;
struct double_link *prior;
struct double_link *next;
}DulNode,*DulLink;
//创建链表
DulLink create();
//链表长度
size_t length(DulLink link);
//链表是否为空
bool isEmpty(DulLink link);
//获取第i-1和节点的地址,工具函数,内部使用
DulNode *addressTool(DulLink link,size_t i);
//插入节点
bool insert(DulLink link,size_t i,datatype data);
//删除节点
bool Delete(DulLink link,size_t i);
//历遍节点
void travel(DulLink link);
#endif //DOUBLE_LINK_H
//**********************************double_link.c************************************
#include "double_link.h"
//创建双向循环链表
DulLink create()
{
DulLink link = (DulLink)malloc(sizeof(DulNode));
link->prior = link;
link->next = link;
return link;
}
//链表长度
size_t length(DulLink link)
{
if(NULL == link)return 0;
DulNode *node = link->next;
size_t count = 0;
while(node != link)
{
count++;
node = node->next;
}
return count;
}
//链表是否为空
bool isEmpty(DulLink link)
{
return (link->next == link);
}
//获取第i-1和节点的地址,工具函数,内部使用
DulNode *addressTool(DulLink link,size_t i)
{
DulNode *prev = link;
for(int j = 1;j < i;j++)
{
prev = prev->next;
}
return prev;
}
//插入节点
bool insert(DulLink link,size_t i,datatype data)
{
if(i<1 || i > length(link)+1)return false;
if(NULL == link)return false;
DulNode *prev = addressTool(link,i);//获得第i-1个节点的地址
DulNode *old = prev->next;//获得原来第i个地址
DulNode *node = (DulNode *)malloc(sizeof(DulNode));//创建新节点
node->data = data;
prev->next = node; //新节点与prev节点的连接
node->prior= prev;
node->next = old;
old->prior = node;
return true;
}
//删除节点
bool Delete(DulLink link,size_t i)
{
if(i<1 || i>length(link))return false;
if(NULL == link)return false;
DulNode *prev = addressTool(link,i);//获取第i-1个节点地址
DulNode *curr = prev->next;
DulNode *behind = curr->next;
prev->next = behind;//将第i-1个节点和i+1个节点连接起来
behind->prior = prev;
free(curr);//释放第i个节点
curr = NULL;
return true;
}
//历遍节点
void travel(DulLink link)
{
DulNode *node = link->next;
while(node != link)
{
printf("%d ",node->data);
node = node->next;
}
printf("\n");
}
//**********************************double_linkTest.c************************************
#include "double_link.h"
int main()
{
DulLink head = create();
printf("length: %d \n",length(head));
printf("isEmpty: %d \n",isEmpty(head));
insert(head,1,77);
travel(head);
insert(head,1,52);
travel(head);
insert(head,3,1314);
travel(head);
insert(head,1,74);
insert(head,1,75);
travel(head);
Delete(head,2);
travel(head);
Delete(head,1);
travel(head);
return 0;
}
附件列表
Chapter 3(线性表)的更多相关文章
- Chapter 1 线性表
Preface: 这部分主要是我考研之前的总结,留作以后用到时再翻出来看看.都是基础的知识点,望各(Da)位(Lao)不喜勿喷,欢迎指正. 适用人群:考研复习过一遍数据结构的,可以看看,查漏补缺(顺便 ...
- 线性表Linearlist
顺序存储,链式存储,索引存储,散列存储 基本运算 SLIST 1.置空表 void SetNull(&L) 2.求长度 int Length(L) 3.取元素 ...
- 数据结构(Java描述)之线性表
基础概念 数据结构:是相互之间存在一种或多种关系的数据元素的集合. 逻辑结构和物理结构 关于数据结构,我们可以从逻辑结构和物理结构这两个维度去描述 逻辑结构是数据对象中数据元素之间的关系,是从逻辑意义 ...
- JAVASE02-Unit04: 集合框架 、 集合操作 —— 线性表
Unit04: 集合框架 . 集合操作 -- 线性表 操作集合元素相关方法 package day04; import java.util.ArrayList; import java.util.Co ...
- 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。
//归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...
- Java集合类学习笔记(各种线性表性能分析)
ArrayList.LinkedList是线性表的两种典型实现:基于数组的线性表和基于链的线性表. Queue代表了队列,Deque代表了双端队列. 一般来说,由于数组以一块连续内存区来保存所有的数组 ...
- 动态分配的顺序线性表的十五种操作—C语言实现
线性表 定义:是最常用的,也是最简单的数据结构,是长度为n个数据元素的有序的序列. 含有大量记录的线性表叫文件 记录:稍微复杂的线性表里,数据元素为若干个数据项组成,这时把一个数据元素叫记录 结构特点 ...
- Java Se :线性表
Java的集合框架分为两个系列,Collection和Map系列.在大学期间,学习数据结构时,好像学习了线性表.非线性表.树,哎,都给忘了.其实,在Collection系列内部又可以分为线性表.集合两 ...
- 数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表
一.简述 [暂无] 二.头文件 #ifndef _2_3_part1_H_ #define _2_3_part1_H_ //2_3_part1.h /** author:zhaoyu email:zh ...
随机推荐
- python2.7 倒计时
From: http://www.vitostack.com/2016/06/05/python-clock/#more Python公告 Python 发布了一个网站 http://pythoncl ...
- Scrum立会报告+燃尽图(十二月六日总第三十七次):程序功能逻辑优化
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...
- Notes of Daily Scrum Meeting(11.8)
Notes of Daily Scrum Meeting(11.8) 预备中开始写代码的第一天,因为大家对Android编程的熟悉程度还是不够,所以工程进行的非常缓慢,有四名队员 开始编写自己的任务, ...
- BufferedInputStream 缓冲输入字节流 -------上
package com.BufferedInputStreamUse; import java.io.BufferedInputStream; import java.io.File; import ...
- 第一个spring冲刺第二天
讨论成员:王俊凯.罗凯杰.王逸辉.马志磊 地点:宿舍 话题:讨论关于安卓的控件的应用和如何调用 选题:四则运算 方向:更加实用的计算器功能,功能更加实用并且简单,没有太多的繁琐操作,可以的话会加上些趣 ...
- 微服务注册与发现 —— eureka
基础概念 在微服务系统中,服务的注册和发现是第一步,常用的有: Eureka:https://github.com/Netflix/eureka Zookeeper:https://zookeeper ...
- js访问对象属性的两种方法
var obj={name:'fuuf',age:19} 第一种,用.访问 obj.name 第二种 用[]访问 obj['name'] //此时name是字符串,要加引号 注意事项 使用第二种方法 ...
- tomcat介绍
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由java语言编写,需要运行在jvm虚拟机中.之所以Java的应用 ...
- 补发9.28“天天向上”团队Scrum站立会议
组长:王森 组员:张金生 张政 栾骄阳 时间:2016.09.28 地点:612寝 组员 已完成 未完成 王森 搭建初步原型 完善原型 张金生 更新UI设计 生成应用界面原型 张政 初步设计框架图 完 ...
- By.cssSelector定位元素一个不足发现
这个如果用cssSelector定位,代码如下,此时输出的数值是0 System.out.println(driver.findElements(By.cssSelector("div[c ...