AfxStd.h
#pragma once
#ifndef AFXSTD_H
#define AFXSTD_H
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#endif // !AFXSTD_H
List.h
#pragma once
#include "AfxStd.h"
#ifndef LIST_H
#define LIST_H
typedef int ElemType;
typedef struct ListNode { /*typedef与struct同时定义新类型*/
ElemType data;
ListNode *next;
}LNode, *LinkList;
struct List { /*存储链表的头结点,以及链表的数据元素个数*/
ListNode *head;
int cursize;
};
ListNode *BuyNode();
void InitList(List &L);
bool push_front(List &L, ElemType e);
bool push_back(List &L, ElemType e);
bool ListInsert(List &L, int pos, ElemType e);
bool ListDelect(List &L, int pos);
bool pop_front(List &L);
bool pop_back(List &L);
int GetLength(List &L);
bool EmptyList(List &L);
bool FullList(List &L);
void PrintfList(List &L);
void InsertSort(List &L);
LNode * FindAdress(List &L, int pos);
LNode *FindValue(List &L, ElemType e);
LNode *PrevFindValue(List &L, ElemType e);
void ClearList(List &L);
void Destory(List &L);
bool Remove(List &L, ElemType e);
void RemoveAll(List &L, ElemType e);
bool IsExist(List &L, ElemType e);
void Reserve(List &L);
LNode* Reserves(List &L);
void UnionList(List &L, List &S, List &F);
#endif // !LIST_H
List.cpp
#include"List.h"
ListNode *BuyNode()
{
ListNode *s = (ListNode *)malloc(sizeof(ListNode));
if (s == NULL)
{
printf("申请空间不成功\n");
exit(1);
}
memset(s, 0, sizeof(LNode));
return s;
}
void InitList(List &L)
{
L.head = BuyNode();
L.cursize = 0;
}
bool push_front(List &L,ElemType e)
{
//ListInsert(L,1, e);
LNode *newNode = BuyNode();
newNode->data = e;
L.head->next = newNode;
newNode->next = L.head->next;
++L.cursize;
return true;
}
bool push_back(List &L, ElemType e)
{
ListInsert(L,L.cursize+1, e);
/*LNode *p = L.head;
int length = L.cursize;
while (length--)
{
p = p->next;
}
while (p->next!=NULL)
{
p = p->next;
}
p = p->next = BuyNode();
p->data = e;
++L.cursize;
*/
return true;
}
bool ListInsert(List &L, int pos, ElemType e)
{
if (pos<1 || pos>L.cursize + 1||L.head==NULL)
{
printf("error");
return false;
}
LNode *p = L.head;
while (1 != pos--) /*先参与运算再自减*/
{
p = p->next;
}
LNode *newNode = BuyNode();
newNode->data = e;
newNode->next = p->next;
p->next = newNode;
L.cursize++;
return true;
}
bool ListDelect(List &L, int pos)
{
if (pos<1 || pos>L.cursize)
{
printf("删除位置有误!");
return false;
}
LNode *p = L.head;
while (p->next!=NULL&&p->next->next!=NULL) /*先参与运算再自减*/
{
p = p->next;
}
LNode *s = p->next;
p->next = s->next;
L.cursize--;
free(s);
return true;
}
bool pop_front(List &L)
{
ListDelect(L,1);
return true;
}
bool pop_back(List &L)
{
ListDelect(L,L.cursize);
return true;
}
int GetLength(List &L)
{
return L.cursize;
}
bool EmptyList(List &L)
{
return GetLength(L) == 0;
}
void PrintfList(List &L)
{
LNode *p = L.head->next;
while(p!=NULL)
{
printf("%d\t",p->data);
p = p->next;
}
}
void InsertSort(List &L)
{
printf("%s","sqsqw");
for (int i = 0; i < L.cursize;i++)
{
LNode *p = L.head;
while (p->next!=NULL&&p->next->next!=NULL)
{
LNode *s = p->next;
LNode *r = s->next;
if (s->data>r->data)
{
s->next = r->next;
p->next = r;
r->next = s;
}
p = p->next;
}
}
}
LNode * FindAdress(List &L, int pos)
{
if (pos<1 || pos>L.cursize + 1)
{
printf("查询位置有误");
return NULL;
}
LNode *p = L.head;
while (1 == pos--) /*先参与运算再自减*/
{
p = p->next;
}
LNode *e = p->next;
return e;
}
LNode *FindValue(List &L, ElemType e)
{
LNode *p = L.head->next;
while (p != NULL && p->data != e)
{
p = p->next;
}
return p;
}
LNode *PrevFindValue(List &L, ElemType e)
{
LNode *p = L.head;
while (p->next!=NULL&&p->next->data!=e)
{
p = p->next;
}
if (p->next==NULL)
{
p = NULL;
}
return p;
}
void ClearList(List &L)
{
LNode *p = L.head;
while (p->next != NULL)
{
LNode *s = p->next;
p->next = s->next;
free(s);
}
L.cursize = 0;
}
void Destory(List &L)
{
ClearList(L);
free(L.head);
L.head = NULL;
}
bool Remove(List &L, ElemType e)
{
LNode *p = PrevFindValue(L,e);
bool res = false;
if (p!=NULL)
{
LNode *q = p->next;
p->next = q->next;
free(q);
L.cursize--;
res = true;
}
return res;
}
void RemoveAll(List &L, ElemType e)
{
LNode *p = L.head;
while (p->next != NULL)
{
if (!Remove(L, e))
{
p = p->next;
}
}
}
bool IsExist(List &L, ElemType e)
{
int length = L.cursize;
LNode *p = L.head;
while (1 == length--) /*先参与运算再自减*/
{
if (p->next->data == e)
{
return true;
}
}
return false;
}
void Reserve(List &L)
{
if (L.cursize<2)
{
return;
}
LNode *p = L.head->next;
L.head->next = NULL;
while(p!=NULL)
{
LNode*r = p;
p = p->next;
r->next = L.head->next;
L.head->next = r;
}
}
LNode* Reserves(List &L) /*原地爆炸*/
{
LNode *pNode = L.head;
LNode *pPrev = NULL;
LNode *pReserver = NULL;
while (pNode!=NULL)
{
LNode *pNext = pNode->next;
if (pNext != NULL)
{
pReserver = pNode;
pNode->next = pPrev;
pPrev = pNode;
pNode = pNext;
}
}
return pReserver;
}
void UnionList(List &L,List &S,List &F)
{
LNode *l = L.head->next;
LNode *s = S.head->next;
LNode *f = F.head->next;
while (l!=NULL&&s!=NULL)
{
if (l->data <= s->data)
{
push_back(F,l->data);
l = l->next;
}
else
{
push_back(F, s->data);
s = s->next;
}
f = f->next;
}
while (l!=NULL)
{
push_back(F, l->data);
l = l->next;
f = f->next;
}
while (s != NULL)
{
push_back(F, s->data);
s = s->next;
f = f->next;
}
}