线性表(链表)
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode {
int data;
struct LNode *next;
}LNode,*LinkList;
void CreatList_L(LinkList &L, int n) {
//逆位序输入n个元素的值,建立带表头结点的单链线性表L.
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;//先建立一个带头结点的单链表
for (int i = n; i > 0; i--) {
LinkList p = (LinkList)malloc(sizeof(LNode));//生成新结点
p->data = i;//赋予元素值
p->next = L->next;//插入到表头
L->next = p;
}
}
void PrintList(LinkList L) {
//从开始结点打印链表L
LinkList p = L->next;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void ReverseList(LinkList &L) {
//倒置链表L
LinkList p = L->next->next;
LinkList q = L->next;//q为开始结点
while (p)//p为NULL时结束循环
{
LinkList r = p->next;
q->next = r;//删掉p
//在头节点后插入p
p->next = L->next;
L->next = p;
p = r;
}
}
void DivideList(LinkList lc, LinkList &la, LinkList &lb) {
//拆分链表lc为la,lb
LinkList pc = lc->next;
while (pc)
{
LinkList pa = (LinkList)malloc(sizeof(LNode));
LinkList tpa = la;
pa->data = pc->data;
while (tpa->next!=NULL)
{
tpa = tpa->next;//找到la的最后一个结点
}
tpa->next = pa;//在la尾部插入pa
pa->next = NULL;
pc = pc->next;
LinkList pb = (LinkList)malloc(sizeof(LNode));
LinkList tpb = lb;
pb->data = pc->data;
while (tpb->next != NULL)
{
tpb = tpb->next;//找到lb的最后一个结点
}
tpb->next = pb;//在lb尾部插入pb
pb->next = NULL;
pc = pc->next;
}
}
void UniqueList(LinkList &l) {
//对链表去重
LinkList p = l->next;
while (p->next)
{
LinkList q = p;
while (q->next)
{
if (q->next->data == p->data) {
LinkList r = q->next;
q->next = r->next;
free(r);
}
if (q->next == NULL) {
break;
}
q = q->next;
//printf("%d q:%d\n", p->data, q->data);
}
if (p->next == NULL)break;
p = p->next;
}
}
int main() {
//测试倒置函数
printf("测试倒置函数:\n");
LinkList L;
int n = 8;
CreatList_L(L, n);
PrintList(L);
ReverseList(L);//倒置L
PrintList(L);
//测试拆分lc为la,lb的函数
printf("测试拆分lc为la,lb的函数:\n");
LinkList lc, la, lb;
int len = 6;
CreatList_L(lc, 2 * len);
CreatList_L(la, 0);
CreatList_L(lb, 0);
PrintList(lc);
DivideList(lc, la, lb);//拆分lc为la,lb
PrintList(la);
PrintList(lb);
//链表去重
printf("链表去重:\n");
LinkList l;
CreatList_L(l, 5);
l->next->data = 5;
l->next->next->data = 5;
l->next->next->next->data = 4;
PrintList(l);
UniqueList(l);
PrintList(l);
getchar();
return 0;
}