谨以此系列纪念逝去的大学时光!
本文共分为两部分,第一部分为顺序表的实现,第二部分为单链表的实现。
均采用分离式编译写法。代码思想来源于《数据结构(C语言描述)》,严蔚敏著。
顺序表如下:
//SqList.h
#ifndef SQLIST_H
#define SQLIST_H
#define LIST_INT_SIZ 100
#define LISTINCREMENT 10
typedef int ElemType;
typedef int Status;
typedef struct
{
ElemType *elem;
int length;
int listsize;
}SqList;
void InitList(SqList &L);
void InsertList(SqList &L, int i, ElemType e);
void DeleteList(SqList &L, int i, ElemType &e);
void PrintList(SqList &L);
void DestroyList(SqList &L);
bool IsEmpty(SqList &L);
Status ListLength(SqList &L);
Status GetElem(SqList &L, int i);
Status LocateElem(SqList &L, ElemType e);
#endif
//SqList.cpp
#include <stdlib.h>
#include <stdio.h>
#include "SqList.h"
void InitList(SqList &L)
{
L.elem = (ElemType*)malloc(LIST_INT_SIZ*sizeof(ElemType));
if(!L.elem)
printf("分配内存失败!");
L.length = 0;
L.listsize = LIST_INT_SIZ;
}
void InsertList(SqList &L, int i, ElemType e)
{
if(i < 1 || i > L.length + 1)
printf("插入位置不合法!");
if(L.length > L.listsize)
{
ElemType *newbase = (ElemType*)realloc(L.elem, (L.listsize + LISTINCREMENT)*sizeof(ElemType));
if(!newbase)
printf("再次分配失败!");
L.elem = newbase;
L.listsize += LISTINCREMENT;
}
for(int j = L.length - 1; j >= i - 1; j++)
L.elem[j+1] = L.elem[j];
L.elem[i-1] = e;
++L.length;
}
void DeleteList(SqList &L, int i, ElemType &e)
{
if(i < 1 || i > L.length)
printf("删除位置不合法!");
e = L.elem[i-1];
for(int j = i; j < L.length; j++)
L.elem[j-1] = L.elem[j];
--L.length;
}
void PrintList(SqList &L)
{
for(int i = 0; i < L.length; i++)
printf("%d ", L.elem[i]);
printf("\n");
}
Status ListLength(SqList &L)
{
return L.length;
}
bool IsEmpty(SqList &L)
{
if(L.length == 0)
return false;
else
return true;
}
Status GetElem(SqList &L, int i)
{
if(i < 1 || i > L.length)
printf("位置非法,不存在这个元素!\n");
return L.elem[i-1];
}
Status LocateElem(SqList &L, ElemType e)
{
for(int i = 0; i < L.length; i++)
if(L.elem[i] == e)
return i+1;
return -1;
}
void DestroyList(SqList &L)
{
if(L.elem)
{
free(L.elem);
L.length = 0;
L.listsize = 0;
}
}
//main.cpp
#include "SqList.h"
#include <stdio.h>
int main()
{
SqList La;
int e;
InitList(La);
for(int i = 0; i < 10; i++)
InsertList(La, i+1, i);
printf("输出线性表La中元素: ");
PrintList(La);
printf("线性表的长度为:%d\n", ListLength(La));
printf("线性表La第五个位置的元素为: %d\n", GetElem(La, 5));
printf("线性表La中17的位置为:%d\n", LocateElem(La, 17));
printf("线性表La中6的位置为:%d\n", LocateElem(La, 17));
DeleteList(La, 5, e);
printf("删除的第五个元素为:%d\n", e);
DestroyList(La);
return 0;
}
运行结果图:
链表如下:
//LinkList.h
#ifndef LINKLIST_H
#define LINKLIST_H
#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1
//LinkList.h
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
LinkList hInsertList(LinkList L, int arr[], int n);
void Traverse(LinkList ls);
Status GetElem(LinkList L, int i, ElemType &e);
Status IsEmpty(LinkList L);
void InsertList(LinkList &L, int i, ElemType e);
#endif
//LinkList.cpp
#include "LinkList.h"
//头插法建立单链表
LinkList hInsertList(LinkList L, int arr[], int n)
{
LinkList second;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
for(int i = 0; i < n; i ++)
{
second = (LinkList)malloc(sizeof(LNode));
second->data = arr[i];
second->next = L->next;
L->next = second;
}
return L;
}
//从头结点顺序遍历单链表
void Traverse(LinkList ls)
{
while(ls->next)
{
printf("%d ", ls->next->data);
ls = ls->next;
}
printf("\n");
}
//获取第i个位置的元素并存入e
Status GetElem(LinkList L, int i, ElemType &e)
{
LinkList p = L->next;
int j = 1;
while(p && j < i)
{
p = p->next;
++j;
}
if(!p || j > i)
return ERROR;
e = p->data;
return OK;
}
//判断链表是否为空
Status IsEmpty(LinkList L)
{
return L->next == NULL;
}
//在第i个位置插入元素e
void InsertList(LinkList &L,int i,ElemType e)
{
LinkList p=L->next;
int j=0;
while(p&&j<i-1)
{
p=p->next;
++j;
}
LinkList s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
}
//main.cpp
#include "LinkList.h"
int main()
{
int e;
LinkList L = NULL;
int arr[] = {9, 5, 3, 2, 1};
LinkList p = hInsertList(L, arr, 5);
printf("头插法建立单链表输出如下:\n");
Traverse(p);
if(GetElem(p, 3, e) == 1)
printf("第4个元素为:%d\n", e);
else
printf("不存在!");
InsertList(p, 1, 4);
Traverse(p);
return 0;
}
运行结果图: