代码示例
/*
function:单链表的合并
created by : xilong
date: 2017.2.5
*/
#include "iostream"
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct Node // 定义结构体
{
ElemType data;
struct Node *next;
}Node;
typedef struct Node* LinkList;
/*
功能:初始化一个空链表
*/
LinkList LinkList_Init()
{
LinkList head;
head = (LinkList)malloc(sizeof(LinkList)); // 申请结点
head->next = NULL; // 头结点的next指向NULL
return head;
}
/*
功能:尾插法创建单链表
*/
void LinkList_CreateFormTail(LinkList *head)
{
LinkList p, s;
p = *head;
int flag = 1;
double number;
while (flag)
{
cin >> number;
if (number != -99999)
{
s = (LinkList)malloc(sizeof(LinkList));
s->data = number;
p->next = s;
p = s;
}
else
{
flag = 0;
p->next = NULL; // 如果到末尾,将末尾结点的next指向NULL
}
}
}
/*
功能:计算链表长度
*/
Status LinkList_Length(LinkList *head)
{
LinkList p;
p = *head;
int count = 0;
if (p == NULL)
{
cout << "空链表!" << endl;
return ERROR;
}
while (p != NULL)
{
count++;
p = p->next;
}
return count-1;
}
/*
功能:两个链表合并
*/
LinkList LinkList_merge(LinkList *LA, LinkList *LB)
{
LinkList p1, p2;
p1 = *LA;
p2 = *LB;
if (p1->next == NULL) // 如果第一个链表为空,就直接返回第二个链表的头结点
{
return *LB;
}
if (p2->next == NULL) // 如果第二个链表为空,返回第一个链表头结点
{
return *LA;
}
while (p1 && p1->next) // 如果第一个链表有元素,将其循环不断指向下一个结点,直到最后一个结点
{
p1 = p1->next;
}
// 将第一个链表的最后一个结点的next连接到第二个链表头结点的next,将两个链表串成一个链表
p1->next = (*LB)->next;
free(*LB);
return *LA; // 返回第一个链表的头结点
}
/*
功能:插入
*/
Status LinkList_Insert(LinkList *head, int i, ElemType e)
{
LinkList pre, s;
pre = *head;
int k = 1;
while (pre && k < i)
{
pre = pre->next;
k++;
}
if (pre == NULL || k > i || i > LinkList_Length(head))
{
cout << "插入位置错误!" << endl;
return ERROR;
}
s = (LinkList)malloc(sizeof(LinkList));
s->data = e;
s->next = pre->next;
pre->next = s;
return OK;
}
/*
功能:打印单链表中所有数据
*/
Status LinkList_Print(LinkList *head)
{
LinkList p;
p = (*head)->next;
if (p == NULL)
{
printf("linklist is empty...\n");
return ERROR;
}
while (p != NULL)
{
printf("%3d", p->data);
p = p->next;
}
printf("\n");
return OK;
}
void main()
{
LinkList LA, LB, LAB;
ElemType e;
cout << "LA链表的初始化以及创建:(输入-99999结束)" << endl;
LA = LinkList_Init();
LinkList_CreateFormTail(&LA);
cout << "打印LA链表数据:";
LinkList_Print(&LA);
int count = LinkList_Length(&LA);
cout << "LA链表的长度为:";
cout << count << endl;
cout << "LB链表的初始化以及创建:(输入-99999结束)" << endl;
LB = LinkList_Init();
LinkList_CreateFormTail(&LB);
cout << "打印LB链表数据:";
LinkList_Print(&LB);
LAB = LinkList_merge(&LA, &LB);
cout << "打印合并后的链表:";
LinkList_Print(&LAB);
cout << "插入数据,输入插入位置:";
int insert;
cin >> insert;
LinkList_Insert(&LAB, insert, 98);
cout << "打印的链表:";
LinkList_Print(&LAB);
system("pause");
}
程序截图
说明
有关单链表的删除,查找等操作,在前几篇文章都有完整的代码示例和程序截图。
单链表的基本操作:http://blog.youkuaiyun.com/xilong_666/article/details/54862457