存储结构
typedef struct LNode
{
ElemType date;
struct LNode *next;
}LNode,*LinkList;
这里定义了LNode的结构体ElemType是为了复用代码
//如果是单纯的数据int...
typedef int ElemType;
//如果是复杂的数据类型那就结构体咯
typedef struct XXX
{
string name;
int age;
}ElemType;
注意!!!
我们为了后面操作的方便,我们在使用某个链表的时候都是带有头空节点的链表
LinkList p,r,L1,L2,L3;
int j;
//初始化链表
int InitList(LinkList &L)
{
L = new LNode;
L->next=NULL;
return 1;
}
基础代码
//获取链表i位置上的元素
int GetDataLinklist(LinkList L, int i, ElemType &e)
{
p = L->next;
j = 1;
while (p&&j<i)
{
p = p->next;
++j;
}
if(!p||j>i)
return 0;//没有找到
e = p->date;//返回元素
return 1;
}
LNode *LocateElem_L(LinkList L, ElemType e){
LinkList q;
q=L->next;
while(q && q->date!=e)
q=q->next;
return q;// 按值查找
}
//插入
int InsertLinklist(LinkList &L, int i, ElemType e)
{
j = 1;
p = L;
LinkList s;
while (j<i&&p!=NULL)
{
j++;
p = p->next;
}
if(p!=NULL)
{
InitList(s);
s->date = e;
s->next = p->next;
p->next = s;
return true;
}
else
return 0;
}
//删除元素
int DelLinklist(LinkList &L, int i, ElemType &e)
{
j = 1;
p = L;
LinkList s;
while (j<i&&p)
{
j++;
p = p->next;
}
if(p==NULL)
return false;
else
{
s=p->next;
if(s==NULL)
return false;
p->next=s->next;//删除q节点
free(s);
return true;
}
}
//尾插法
void CreatLinklist_R(LinkList &L,int n)
{
InitList(L);
L->next = NULL;
r = L;
for (int i = 0; i < n; i++)
{
p = new LNode;
cin >> p->date;
p->next = NULL;
r->next = p;
r = p;
}
r->next = NULL;
}
//循环单链表
void CreatLinklist_(LinkList &L,int n)
{
InitList(L);
L->next = NULL;
r = L;
for (int i = 0; i < n; i++)
{
p = new LNode;
cin >> p->date;
p->next = NULL;
r->next = p;
r = p;
}
r->next = L->next;
}
//头插法
void CreatLinklist_H(LinkList &L,int n)
{
InitList(L);
L->next = NULL;
for (int i = 0; i < n; i++)
{
p = new LNode;
cin >> p->date;
p->next = L->next;
L->next = p;
}
}
void Printlist(LinkList L)
{
p = L->next;
while (p!=NULL)
{
printf("%d ", p->date);
p = p->next;
}
puts("");
}
//这是我的作业部分,找两个上升序列的差集
void slove(LinkList La,LinkList Lb,LinkList &Lc)
{
LinkList p = La->next;
ElemType e;
while (p!=NULL)
{
e = p->date;
if(LocateElem_L(Lb, e)==NULL)
{
InsertLinklist(Lc, 1, e);
}
p = p->next;
}
Printlist(Lc);
}
//约瑟夫环
void solve(int n,int m)
{
CreatLinklist_(L1,n);//创建一个循环链表
LinkList p = L1->next,head;
head = p->next;
int cnt = 1;
LinkList s;
while (p!=head)
{
if(cnt<m)
{
head = p;
p = p->next;
cnt++;
}
else{
head->next = p->next;
s = p;
cout << s->date << " ";
p = p->next;
free(s);
cnt = 1;
}
}
cout << p->date;
free(p);
}