"Common.h"
#ifndef COMMON_H_INCLUDED
#define COMMON_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
#endif // COMMON_H_INCLUDED
"List_Linked.h"
#ifndef LIST_LINKED_H_INCLUDED
#define LIST_LINKED_H_INCLUDED
#include "Common.h"
typedef struct LNode {//結點類型
ElemType data;
struct LNode * next;
} Link, * Position;
typedef struct {//鏈表類型
Link * head;
Link * tail;
int len;
} LinkList;
Status MakeNode_Linked(Link * p, ElemType e);
void FreeNode_Linked(Link * p);
Status InitList_Linked(LinkList * l);
Status DestroyList_Linked(LinkList * l);
Status ClearList_Linked(LinkList * l);
Status InsFirst_Linked(LinkList * l, Link * s);//h爲頭結點,s爲所指結點,s插入到第一個結點前
Status DelFirst_Linked(LinkList * l, Link * q);
Status Append_Linked(LinkList * l, Link * s);//將s所指一串結點鏈接在list的最後一個結點並修改list尾指針
Status Remove_Linked(LinkList * l, Link * q);//刪除尾結點,以q返回,改變list尾指針
Status InsBefore_Linked(LinkList * l, Link * p, Link * s);//在p指向的結點前插入結點s,修改指針p指向新插入的結點
Status InsAfter_Linked(LinkList * l, Link * p, Link * s);
Status SetCurElem_Linked(Link * p, ElemType e);//用e更新p的值
ElemType GetCurElem_Linked(Link p);
Status ListEmpty_Linked(LinkList * l);
int ListLength_Linked(LinkList * l);
Position GetHead_Linked(LinkList * l);
Position GetLast_Linked(LinkList * l);
Position PriorPos_Linked(LinkList * l, Link * p);//返回p的前驅
Position NextPos_Linked(LinkList * l, Link * p);
Status LocatePos_Linked(LinkList * l, int i, Link * p);//p返回list中第i個結點的位置
Position LocateElem_Linked(LinkList * l, ElemType e);//返回list中與e相等的元素的位置
Status ListTraverse_Linked(LinkList * l);
#endif // LIST_LINKED_H_INCLUDED
"List_Linked.c"
#include "List_Linked.h"
Status MakeNode_Linked(Link * p, ElemType e)
{
p->data = e;
p->next = NULL;
return OK;
}
void FreeNode_Linked(Link * p)
{
free(p);
}
Status InitList_Linked(LinkList * l)
{
l->head = (Link *)malloc(sizeof(Link));
l->tail = (Link *)malloc(sizeof(Link));
if(!l->head || !l->tail)
exit(OVERFLOW);
l->len = 0;
l->head = l->tail;
l->tail->next = NULL;
return OK;
}
Status DestroyList_Linked(LinkList * l)
{
ClearList_Linked(l);
free(l->head);
l->tail = NULL;
l->len = 0;
l = NULL;
return OK;
}
Status ClearList_Linked(LinkList * l)
{
Link * temp;
Link * temp2;
if(l->head != l->tail)
{
temp = l->head->next;
l->head->next = NULL;
l->len = 0;
while(temp != l->tail)
{
temp2 = temp->next;
free(temp);
temp = temp2;
}
free(temp);
l->tail = l->head;
}
return OK;
}
Status InsFirst_Linked(LinkList * l, Link * s)//h爲頭結點,s爲所指結點,s插入到第一個結點前
{
Link * h = l->head;
if(h != l->tail)
{
s->next = h->next;
}
else
{
s->next = NULL;
l->tail = s;
}
h->next = s;
l->len++;
return OK;
}
Status DelFirst_Linked(LinkList * l, Link * q)
{
if(l->head != l->tail)
{
q = l->head->next;
if(!q->next)
{
l->tail = l->head;
}
else
{
l->head->next = q->next;
}
l->len--;
return OK;
}
else
{
return ERROR;
}
}
Status Append_Linked(LinkList * l, Link * s)//將s所指一串結點鏈接在list的最後一個結點並修改list尾指針
{
Link * temp = l->tail;
temp->next = s;
int i = 1;
while(temp->next)
{
temp = temp->next;
i++;
}
l->len += i;
l->tail = temp;
return OK;
}
Status Remove_Linked(LinkList * l, Link * q)//刪除尾結點,以q返回,改變list尾指針
{
Link * temp = l->head;
while(temp->next->next)
{
temp = temp->next;
}
*q = *temp->next;
l->tail = temp;
l->tail->next = NULL;
printf("%d ", q->data);
return OK;
}
Status InsBefore_Linked(LinkList * l, Link * p, Link * s)//在p指向的結點前插入結點s,修改指針p指向新插入的結點
{
Link * temp = l->head;
while(temp->next && temp->next != p)
{
temp = temp->next;
}
s->next = p;
temp->next = s;
l->len++;
return OK;
}
Status InsAfter_Linked(LinkList * l, Link * p, Link * s)
{
s->next = p->next;
p->next = s;
if(p == l->tail)
{
l->tail = s;
}
l->len++;
return OK;
}
Status SetCurElem_Linked(Link * p, ElemType e)//用e更新p的值
{
p->data = e;
return OK;
}
ElemType GetCurElem_Linked(Link p)
{
return p.data;
}
Status ListEmpty_Linked(LinkList * l)
{
if(l->head == l->tail)
return TRUE;
else
return FALSE;
}
int ListLength_Linked(LinkList * l)
{
return l->len;
}
Position GetHead_Linked(LinkList * l)
{
return l->head;
}
Position GetLast_Linked(LinkList * l)
{
return l->tail;
}
Position PriorPos_Linked(LinkList * l, Link * p)//返回p的前驅
{
Link * temp = l->head;
while(temp && temp->next!=p)
temp = temp->next;
return temp;
}
Position NextPos_Linked(LinkList * l, Link * p)
{
return p->next;
}
Status LocatePos_Linked(LinkList * l, int i, Link * p)//p返回list中第i個結點的位置
{
if(i<1 || i>ListLength_Linked(l))
{
return ERROR;
}
int j;
Link * temp = l->head;
for(j=0; j<i; j++)
{
temp = temp->next;
}
*p = *temp;
return OK;
}
Position LocateElem_Linked(LinkList * l, ElemType e)//返回list中與e相等的元素的位置
{
Link * temp = l->head;
while(temp)
{
if(temp->data == e)
return temp;
temp = temp->next;
}
return NULL;
}
Status ListTraverse_Linked(LinkList * l)
{
if(l->len != 0)
{
Link * temp = l->head->next;
while(temp)
{
printf("%d ", temp->data);
temp = temp->next;
}
}
return OK;
}