LinkList.h

#ifndef LINKLIST_H_INCLUDED
#define LINKLIST_H_INCLUDED

//单链表的存储结构
typedef char ElemType;
typedef struct LNode
{
ElemType date;//存放元素值
struct LNode * next;//指向后继节点
}LinkList;

//双链表的存储结构
typedef struct DNode
{
ElemType date;//存放元素值
struct DNode *prior;//指向前驱节点
struct NNode *next;//指向后继节点
}DLinkList;
#endif // LINKLIST_H_INCLUDED

main.cpp

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"
using namespace std;

//头插法建表
void CreateListF(LinkList *&L,ElemType a[],int n)
{
LinkList *s;
int i;
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
for(i=0;i<n;i++)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->date=a[i];
s->next=L->next;
L->next=s;

}
}

//尾插法建表
void CreateListR(LinkList *&L,ElemType a[],int n)
{
LinkList *s,*r;
int i;
L=(LinkList *)malloc(sizeof(LinkList));
r=L;
for(i=0;i<n;i++)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->date=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}

//初始化线性表
void InitList(LinkList *&L)
{
L=(LinkList*)malloc(sizeof(LinkList));
L->next=NULL;
}

//销毁线性表
void DestroyList(LinkList *&L)
{
LinkList * pre=L,*p=L->next;
while(p!=NULL)
{
free(pre);
pre=p;
p=pre->next;
}
free(pre);
}

//判断线性表是否为空
bool ListEmpty(LinkList *L)
{
return (L->next==NULL);
}

//求线性表长度
int ListLength(LinkList *L)
{
int n=0;
LinkList *p=L;
while(p->next!=NULL)
{
n++;
p=p->next;
}
return n;
}

//输出线性表
void DispList(LinkList *L)
{
LinkList *p=L->next;
while(p!=NULL)
{
printf("%c",p->date);
p=p->next;
}
printf("\n");
}

//求线性表中某个元素的值
bool GetElem(LinkList *L,int i,ElemType &e)
{
int j=0;
LinkList *p=L;
while(j<i&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
return false;
else
{
e=p->date;
return true;
}
}

//按元素值查找
int LocateElem(LinkList *L,ElemType e)
{
int j=0;
LinkList *p=L->next;
while(p!=NULL&&p->date!=e)
{
p=p->next;
j++;
}
if(p==NULL)
return 0;
else
{
return j;
}
}

//插入数据元素
bool ListInsert(LinkList *&L,int i,ElemType e)
{
int j=0;
LinkList *s,*p=L;
while(j<i-1&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
return false;
else
{
s=(LinkList*)malloc(sizeof(LinkList));
s->date=e;
s->next=p->next;
p->next=s;
return true;
}
}

//删除数据元素
bool ListDelete(LinkList *&L,int i,ElemType &e)
{
int j=0;
LinkList *p=L,*q;
while(j<i-1&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
return false;
else
{
q=p->next;
if(q==NULL)
return false;
e=q->date;
p->next=q->next;
free(q);
return true;
}
}

int main()
{
LinkList *h;
ElemType e;
printf("单链表的基本运算如下:\n");
printf(" (1)初始化单链表h\n");
InitList(h);
printf(" (2)依次采用尾插法插入a,b,c,d,e元素\n");
ListInsert(h,1,'a');
ListInsert(h,2,'b');
ListInsert(h,3,'c');
ListInsert(h,4,'d');
ListInsert(h,5,'e');
printf(" (3)输出单链表h:");
DispList(h);
printf(" (4)单链表h长度=%d\n",ListLength(h));
printf(" (5)单链表h为%s\n",(ListEmpty(h)?"空":"非空"));
GetElem(h,3,e);
printf(" (6)单链表h的第3个元素=%c\n",e);
printf(" (7)元素a的位置=%d\n",LocateElem(h,'a'));
printf(" (8)在第4个元素位置上插入f元素\n");
ListInsert(h,4,'f');
printf(" (9)输出单链表h:");
DispList(h);
printf(" (10)删除h的第3个元素\n");
ListDelete(h,3,e);
printf(" (11)输出单链表h:");
DispList(h);
printf(" (12)释放单链表h\n");
DestroyList(h);
return 0;
}

运行结果:

线性表之链式表基本操作_typedef