#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
} LNode, *LinkList;
void InitList(LinkList &L) //初始化线性表
{
L = (LinkList)malloc(sizeof(LNode)); //创建头结点
L->next = NULL;
L->data = -1;
}
void Build(LinkList &L)//建立一个带头结点的单链表
{
int n;
LinkList p, q;
p = L;
printf("请输入数据元素个数n:\n");
scanf("%d", &n);
printf("请输入%d个数据元素:\n", n);
while(n--)
{
q = (LinkList)malloc(sizeof(LNode));
scanf("%d", &q->data);
q->next = NULL;
p->next = q;
p = q;
}
}
int n = 0;//计数君n
void count(LinkList L, int x)
{
Node *p;//定义一个指针节点p
p = L;//将p初值指向链表头节点
printf("\n请输入要找的元素值x:");
scanf("%d", &x);//输入需要查找的数
while(p!= NULL)//用while循环遍历单链表L
{
if(p->data == x)
n++;//正在遍历的数用if语句判断是否等于x,若等于,计数君n+1
p = p->next;//无论if语句中判断真或假,判断完就可以执行下一个数
}//(这里的p=p->next不可以在大括号外,否则遍历不能完全执行)
printf("表中含有%d个%d\n", n, x);//while循环执行完毕可以输出
}
int s=0,j=0;//定义总结点数为s。j记忆第几个节点
void find(LinkList L,int m)
{
Node *p;
p=L;
printf("\n你要查找倒数第几个结点的值?");
scanf("%d",&m);
while(p!=NULL)
{
p=p->next;
s++;
}
while((p->next!=NULL)&&(j<s-m+1))
{
p=p->next;
j++;
}
printf("倒数第%d个元素的值为%d\n",m,p);
}
int main()
{
LinkList L;
InitList(L);
Build(L);
count(L,n);
find(L,p);
return 0;
}
相关分类