// ListDemo.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include "pch.h"
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define TRUE 1
typedef int Status;
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode *next;
}*Link;
typedef struct {
Link head, tail;
int len;
}LinkList;
/*分配结点*/
Status MakeNode(Link &p,ElemType e) {
p = (Link)malloc(sizeof(struct LNode));
if (!p)
return ERROR;
p->data = e;
p->next = NULL;
return OK;
}
/*释放结点*/
Status FreeNode(Link &p) {
if (!p)
return ERROR;
free(p);
return OK;
}
/*初始化链表*/
Status InitList(LinkList &L) {
L.head = (Link)malloc(sizeof(struct LNode));
if (!L.head)
return ERROR;
L.head->next = NULL;
L.tail = L.head;
L.len = 0;
return OK;
}
/*销毁链表*/
Status DestroyList(LinkList &L) {
Link p,q;
p = L.head;
while (p) {
q = p;
free(q);
p = p->next;
}
L.head = L.tail = NULL;
return OK;
}
/*清空链表*/
Status ClearList(LinkList & L) {
Link p,q;
p = L.head->next;
while (p) {
q = p;
free(q);
p = p->next;
}
L.head->next = NULL;
L.head = L.tail;
L.len = 0;
return OK;
}
/*插入第一个结点前面*/
Status InFirst(Link h, Link s) {
s->next = h->next;
h->next = s;
return OK;
}
/*删除第一个结点*/
Status DelFirst(Link h,Link &q) {
Link p = h->next;
p = q;
h->next = q->next;
free(p);
return OK;
}
/*将指针s所指一串结点连接到L的最后一个结点*/
Status Append(LinkList &L,Link s) {
Link q = s, t = NULL;
int i = 0;
L.tail ->next= s;
while (q) {
t = q;
q = q->next;
i++;
}
L.len += i;
L.tail = t;
return OK;
}
/*移除尾节点,并使尾指针指向新的结点*/
Status Remove(LinkList &L,Link &q) {
Link p = L.head->next;
Link t = NULL;
q = L.tail;
while (p != L.tail) {
t = p;
p = p->next;
}
L.tail = t;
L.len--;
free(q);
return OK;
}
/*已知p指向链表的一个结点,将s所指结点插入到p所指结点之前,并修改p所指向新节点*/
Status InsBefore(LinkList &L, Link&p, Link s) {
Link q = L.head->next;
Link t = NULL;
while (q!= p) {
t = q;
q = q->next;
}
s->next = t;
t->next = s;
p = s;
L.len++;
return OK;
}
/*已知p指向链表的一个结点,将s所指结点插入到p所指结点之后,并修改p所指向新节点*/
Status InsAfter(LinkList &L,Link &p,Link s) {
s->next = p->next;
p->next = s;
p = s;
L.len++;
return OK;
}
/*已知p指向一个结点,用e更新节点的数据域*/
Status SetCurElem(Link &p,ElemType e) {
p->data = e;
return OK;
}
/*已知p指向一个结点,返回p结点所指数据元素*/
ElemType GetCurElem(Link p) {
return p->data;
}
/*判断线性表是否为空*/
Status ListEmpey(LinkList L) {
if (L.len == 0 || L.head == L.tail)
return OK;
return ERROR;
}
/*返回链表的长度*/
int ListLength(LinkList L) {
return L.len;
}
/*返回链表表头的位置*/
Link GetHead(LinkList L) {
return L.head;
}
/*返回链表所指最后结点*/
Link GetLast(LinkList L) {
return L.tail;
}
/*已知p所指链表的一个结点,返回其前驱的位置。若无前驱,返回NULL*/
Link PriorList(LinkList L,Link p) {
if (p == L.head)
return NULL;
Link q = L.head;
while (q->next!= p) {
q = q->next;
}
return q;
}
/*已知p所指链表的一个结点,返回其后继的位置,若无后继,返回NULL*/
Link NextList(LinkList L,Link p) {
if (p == L.tail)
return NULL;
Link q = L.head->next;
while (q!= p) {
q = q->next;
}
return q;
}
/*返回p所指链表的第i个结点的位置,并返回OK,i值不合法时返回ERROR*/
Status LocatePos(LinkList L,int i,Link &p) {
if (i < 1||i > L.len)
return ERROR;
int j = 0;
Link q = L.head;
while (j < i) {
q = q->next;
j++;
}
p = q;
return OK;
}
/*遍历链表*/
void ListTraverse(LinkList L) {
Link p = L.head->next;
while (p) {
printf("%d ",p->data);
}
}
int main()
{
LinkList L;
Link p, s1, s2;
int e, len;
MakeNode(p,10);
MakeNode(s1,10);
InitList(L);
Link h = L.head;
InFirst(h,s1);
printf("%d",s1->data);
return 0;
}