//1、有头结点方便对首元数据元素的删除,插入操作。不带头结点要判断是不是作用在首元,是就得改变头指针指向。
//2、头结点数据域可以存表长。(head->data-k+1)取倒数第k个元素。——两遍。
//(走一遍,定义两个指针,先走一个,使两个之间相差k个位置,再一起移动,走得快的的走到空了,走得慢的的数据域就是指定元素。)
//
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;//ListList p==LNode *p
void Init(LinkList *L)//引用用&,下面直接用p。
{
*L = (LinkList)malloc(sizeof(struct LNode));
(*L)->next = NULL;//建头结点
}
//或者int Init()
//{
// L = ;
// return L;
//}
//void Creat(LinkList L, int n)
//{
//
//}
LinkList Creat(int n)
{
LinkList h;
h = (LinkList)malloc(sizeof(struct LNode));
h->next = NULL;
for (int i = 0; i < n; i++)
{
int d;
scanf("%d", &d);
LinkList s = (LinkList)malloc(sizeof(struct LNode));
s->data = d;
s->next = NULL;
s->next = h -> next;
h->next = s;
}
return h;
}
void OutPrint(LinkList L)
{
LNode *p;
p = L->next;
while (p)
{
printf("%d", p->data);
p = p->next;
}
//或者 LNode *p=L; while(p->next) printf("");比较别扭,放弃!
}
int Length(LinkList L)
{
LNode *p;
p = L->next;
int count = 0;//指向首元从零开始
while (p)
{
//if (p->data < e) num++; 统计比e小的。
count++;
p = p->next;
}
return count;
}
int Locate(LinkList L, int i)
{
LinkList p = L->next;
int count = 1;//画图看,不能从0开始。
while (p&&count<i)
{
count++;
p = p->next;
}
if(!p||count>i)//左界之外和右界之外
if (count == i) return p->data;
return NULL;
}
int main()
{
LinkList head;
Init(&head);
int n;
scanf("%d", &n);
//Creat(head, n);
head=Creat(n);
OutPrint(head);
printf("\n%d\n", Length(head));
return 0;
}
//头插法和尾插法
//空白表,建结点,将数据存入数据域,将该新结点插到链表前端。先接后面的结点。
//如在头结点后插入s;
//s->next = L->next;
//L->next = s;
//先来的在后面,所以是个逆序表。
//
//尾插法——正序。
//while(p->next)太麻烦,建立一个尾指针。
//r->next=s;
//s->next=NULL;注意不能忘,否则链表没有结束。可以放在最前面。