//测试环境:VS2015
#include "stdafx.h"
#include<stdlib.h>
#include<stdio.h>
//宏定义
#define ERROR 0
#define OK 1
//定义单链表的存储结构
typedef struct LNode
{
int data;
struct LNode *next;
}LNode, *LinkList;
//在带头节点的链表中获取第i个节点值,并用元素e返回
int getElem(LinkList L, int i, int &e)
{
//L是带头节点的单链表的头指针
LinkList p = L->next;
int j = 1;
while (p&&j < i)
{
p = p->next;//寻找第i个节点
j++;
}
if (!p || j > i)
{
return ERROR;
}
e = p->data;
return OK;
}
//在带头节点的链表中的第i个节点前插入元素e
int listInsert(LinkList &L, int i, int e)
{
LinkList p = L;
int j = 0;
while (p&&j < i-1)
{
p = p->next;//寻找第i-1个节点
j++;
}
if (!p||j>i-1)
{
return ERROR;
}
LinkList s = (LinkList)malloc(sizeof(LNode));
if (!s)
{
return ERROR;
}
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
//在头节点的单链表L中,删除第i个节点的元素,并用e返回
int listDelete(LinkList &L, int i, int &e)
{
LinkList p = L;
int j = 0;
while (p->next&&j < i - 1)
{
p = p->next;//寻找第i-1个节点
j++;
}
if (!(p->next) || j > i - 1)
{
return ERROR;
}
LinkList q = p->next;
e = q->data;
p->next = q->next;
free(q);
return OK;
}
//创建链表
int createList(LinkList &L, int n)
{
//按顺位序输入n个元素的值,建立带头节点的单链表
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;//建立头节点
LinkList q = L;
for (int i = 1; i <= n; i++)
{
LinkList s = (LinkList)malloc(sizeof(LNode));
if (!s)
{
return ERROR;
}
scanf_s("%d", &s->data);
q->next = s;
s->next = NULL;
q = s;
//按逆序位输入
//s->next = L->next;//连接第一个节点
//L->next = s;
}
return OK;
}
//合并链表
int mergerList(LinkList &La, LinkList &Lb, LinkList &Lc)
{
//已知单链表La,Lb按值非递减排列,合并后得到的单链表Lc也按值非递减排列
LinkList pa = La->next;
LinkList pb = Lb->next;
LinkList pc = Lc = La;
while (pa&&pb)
{
if (pa->data <= pb->data)
{
pc->next = pa; pc = pa; pa = pa->next;
}
else
{
pc->next = pb; pc = pb; pb = pb->next;
}
}
pc->next = pa ? pa : pb;
free(Lb);//释放Lb的头节点
return OK;
}
//测试
int main()
{
int e;
LinkList list1,list2,list3;
//创建链表list1
createList(list1, 7);
for (int i = 1; i <= 7; i++)
{
getElem(list1, i, e);
printf("%d ", e);
}
printf("\n");
//插入节点
listInsert(list1, 8, 100);
for (int i = 1; i <= 8; i++)
{
getElem(list1, i, e);
printf("%d ", e);
}
printf("\n");
listDelete(list1, 1, e);
for (int i = 1; i <= 7; i++)
{
getElem(list1, i, e);
printf("%d ", e);
}
printf("\n");
//创建链表list2
createList(list2, 7);
for (int i = 1; i <= 7; i++)
{
getElem(list2, i, e);
printf("%d ", e);
}
printf("\n");
//合并链表到list3
mergerList(list1, list2, list3);
for (int i = 1; i <= 14; i++)
{
getElem(list3, i,e);
printf("%d ", e);
}
printf("\n");
return 0;
}
数据结构之线性表的链式表示和实现
最新推荐文章于 2022-10-13 15:46:11 发布