//循环链表
//即:位序概念已经淡化了,使用在线性表中的位置概念来反映情况。
//本文之中所有的数据均使用NULL代替
#define _CRT_SECURE_NO_WARNINGS_
#define ElemType int
#define OVERFLOW -2
#include<stdio.h>
#include<math.h>
typedef struct node {
ElemType data;//方便之后修改数据
struct node* next;//这个前边要带一个struct 然后使用上边定义的名字
}Node;//定义节点类型,可以直接定义成指针变量,之后就不用加指针了,我在这里先不写了.
typedef struct {
Node* head;//指向头结点
Node* tail;//指向队列的尾结点
int len;
}LinkList;//定义队列
Node* MakeNode(Node* prior,ElemType e){
Node* p = (Node*)malloc(sizeof(Node));
if (!p) exit(OVERFLOW);
p->next = prior->next;
p->data = e;
prior->next = p;
return p;
}//生成节点并返回,需要提供前一个结点,无法在头结点使用。
void FreeNode(Node* p) {
free(p);
}//释放指定的结点
LinkList* InitList() {
LinkList* La = (LinkList*)malloc(sizeof(LinkList));
if (!La) exit(OVERFLOW);
La->len = 0;
Node* temp = (Node*)malloc(sizeof(Node));
temp->data = NULL;
temp->next = temp->next;
La->head = temp;
La->tail = La->head;
}//创造一个空的线性表
void DestoryList(LinkList* La) {
Node* cursor = La->head;
Node* flag = La->tail;
Node* temp;
while (cursor != flag) {
temp = cursor->next;
free(cursor);
cursor = temp;
}//删除除了flag之外的所有结点
free(La->tail);//删除最后一个指针
free(La);//删除指向整个链表的指针
}//删除链表
void ClearList(LinkList* La){
Node* cursor = La->head;
LinkList* temp=La;
DestoryList(La);//删除原有链表
LinkList* La = InitList();//创建一个新的链表让其头尾指针等于原有链表,长度为一
La->head = cursor;
La->tail = La->head;
}//清空链表
LinkList* InsFirst(LinkList* La,ElemType e) {
Node* p = MakeNode(La->tail, NULL);
La->head = p;
La->len++;
return La;
}//在头结点之前插入一个元素。
void DelFirst(LinkList* La) {
Node* temp = La->head->next;
free(La->head);
La->head = temp;
}//删除头结点并将头结点变为第二个元素。
LinkList* AppEnd(LinkList* La, ElemType e) {
Node* p = MakeNode(La->tail, NULL);
La->tail = p;
}//添加一个尾戒点并更改tail的指向
void DelEnd(LinkList* La) {
Node* flag = La->tail;
Node* cursor = La->head;
while (cursor->next != flag) {
cursor = cursor->next;
}
free(La->tail);
La->tail = cursor;
}//删除最后的尾部的结点
int main() {
return 0;
}
?
|