一 线性表
1 顺序表:
typedef struct {
int elem[100];
int length; //length是顺序表的长度
} SqList;
顺序表的长度是固定的,elem存放数据,存入一个数据length+1。
1.1 顺序表的创建
void Dnital(Sqlist &L)
{
cout << "请输入线性表的长度" << endl;
cin >> L.last;
cout << "请输入元素" << endl;
for (int i = 0; i < L.last; i++)
{
cin >> L.str[i];
}
}
1.1 顺序表的删除
void Delete(Sqlist &L)
{
int a;
cout << "请输入要删除的元素的位置" << endl;
cin >> a;
if (a > L.last || a < 1) //如果大于当前的长度或者小于0则输入错误
{
cout << "输入错误" << endl;
}
else
{
L.str[a - 1] = 0;
for (int i = a; i < L.last; i++)
{
L.str[i - 1] = L.str[i];
}
}
L.last--;
}
1.1 顺序表的增加
void Insert(Sqlist &L)
{
int t;
cout << "请输入插入元素的位置" << endl;
cin >> t;
if (t < 1 || t>L.last)
{
cout << "未知错误" << endl;
}
else
{
for (int i = L.last - 1; i > t - 2; i--)
{
L.str[i + 1] = L.str[i];
}
cout << "输入插入元素的值" << endl;
cin >> L.str[t-1];
L.last++;
}
}
2 单链表:
typedef struct LNode{
int elem;
struct LNode *next;
} LNode, *LinkList;
elem存放数据,*next是一个LNode类型的指针,存放下一个节点。
LNode是一个结点,*LinkList是头指针。
注意:头节点是指向第一个节点的,头结点内不存放数据,当有头结点的时候头指针指向头结点,没有头结点的时候指向第一个节点。
2.1 单链表的创建
void CreatList(LinkList &v, int n)
{//生成一个带头结点的有n个元素的单链表
int i;
LinkList p;
v = (LinkList)malloc(LEN); //生成头结点
v->next = NULL;
cout << "请输入%d个字符:例如:abcdefg\n" << endl;
getchar();
for (i = n; i>0; --i)
{
p = (LinkList)malloc(LEN); //生成新结点
scanf("%c", &p->data);
p->next = v->next; //新结点的是最后一个结点,所以next为NULL
v->next = p;//使v里面的next存放p
}
}
2.2 单链表的删除
BOOL ListDelete(LinkList &v, int i, char &e)
{//在单链表中删除第i个元素,成功删除返回True,并用e返回该元素值,失败返回False
LinkList p, q;
int j = 0;
p = v;
while (p->next&&j<i - 1) //查找第i-1个元素位置
{
p = p->next; ++j;
}
if (!(p->next) || j>i - 1) return False; //查找失败
q = p->next; p->next = q->next; //删除该元素
e = q->data; //e取得该元素值
free(q); //释放该元素空间
return True;
}
2.3单链表的增加
BOOL ListInsert(LinkList &v,int i,char e)
{//在单链表的第i各位置插入元素e,成功返回True,失败返回False
LinkList p,s;
int j=0;
p=v;
while(p&&j<i-1) {p=p->next;++j;} //查找第i-1个元素的位置
if(!p||j>i-1) return False; //没有找到
s=(LinkList)malloc(LEN); //生成一个新结点
s->data=e;
s->next=p->next; //将新结点插入到单链表中
p->next=s;
return True;
}
3 循环链表
循环链表和单链表一样,只不过循环链表的最后一个节点的next指向头结点。
4 双向链表
typedef struct DLNode {
int elem;
struct DLNode *prior;
struct DLNode *next;
} DLNode, *DLinkList;
双向链表多了一个prior指针,指向前一个元素。
4.1 双向链表的增加
BOOL ListInsert(sLinkList &v, int i, char e)
{//在单链表的第i各位置插入元素e,成功返回True,失败返回False
sLinkList p, s;
int j = 0;
p = v;
while (p&&j<i - 1) { p = p->next; ++j; } //查找第i个元素的位置
if (!p || j>i - 1) return False; //没有找到
s = (sLinkList)malloc(LEN); //生成一个新结点
s->data = e;
s->prior = p->prior; //将新结点插入到单链表中
s->next = p->prior->next;
s->next = p;
p->prior = s;
return True;
}
4.2 双向链表的删除
BOOL ListDelete(LinkList &v, int i, char &e)
{//在单链表中删除第i个元素,成功删除返回True,并用e返回该元素值,失败返回False
LinkList p, q;
int j = 0;
p = v;
while (p->next&&j<i - 1) //查找第i-1个元素位置
{
p = p->next; ++j;
}
if (!(p->next) || j>i - 1) return False; //查找失败
p->prior->next = p->next; //把要删除元素的前一个结点的prior指向他的后面的节点
p->next->prior = p->prior; //把他后面节点的next指向前面的节点
free(p); //释放该元素空间
return True;
}
5 静态链表
typedef struct {
int elem;
int next;
} SLNode, slinklist[MAXSIZE];
结点里面的next存放的是下一个结点在数组中的位置。
数组的第一个元素和最后一个元素不放数据。
没有使用的数组元素称为备用链表,数组0,存放第一个备用链表。
备用链表最后一个元素存放第一个存放数组的下标。