/*查找单链表中的特定序列i,特定元素key*/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define Max 20
typedef struct Node{
char data;
struct Node*next;
}Node,*Linklist;//声明Node为结构体类型,Linklist为结构体指针类型
/*
void Initiallist(Linklist* L)//建立空的单链表
{
/*1.L是指向单链表的头结点的指针,用来接收主程序中待初始化单链表的头指针变量的地址
* 2.*L相当于主程序中代初始化单链表的头指针变量
* 3.L可以通过*L的地址访问结构体指针类型*L,从而通过指向头结点的指针L访问结构体中的成员*/
/*
*L=(Linklist)malloc(sizeof(Node)*10);//*L中存放malloc函数返回的结构体指针类型的地址,这个地址又在L中存放着
(*L)->next=NULL;//这个节点的指针域置空
}
*/
Linklist initiallist(Linklist L){
L=(Linklist)malloc(sizeof(Node));//*L中存放malloc函数返回的结构体指针类型的地址,这个地址又在L中存放着
if(L==NULL)
printf("error!");
else
printf("initial successful!\n");
L->next=NULL;
return L;
}
/*头插法建立单链表*/
void createhead(Linklist L){
/*L是带头节点的空链表头指针*/
Node*s;
char c;
int flag = 1;
while(flag)
{
fflush(stdout);
c=getchar();
if(c!='$'){
s=(Node*)malloc(sizeof(Node));
s->data=c;
s->next=L->next;
L->next=s;
}else flag=0;
}
}
/*尾插法建立单链表*/
void createtail(Linklist L){
char c;
Node*r,*s;
int flag=1;
r=L;//r指针动态指向链表的当前表尾,一边于做尾插入,其初值指向头结点
while(flag){
fflush(stdout);
c=getchar();
if(c!='$')
{
s=(Linklist)malloc(sizeof(Node));
s->data=c;
r->next=s;
r=s;//指针r后移
}
else
{
flag=0;
r->next=NULL;//将表的最后一个节点的next域置为空,表示链表的结束
printf("success create list L as following...\n");
}
}
}
void print(Linklist L){
Node *p=L->next;
while(p!=NULL)
{
printf("%2c",p->data);
p=p->next;
}
printf("\n");
}
/*查找第i个节点*/
Node* geti(Linklist L,int i){
printf("search the %d node is:",i);
if(i<0)return NULL;
int j=0;
Node*p=NULL;
p=L;//新建一个指向链表头结点的节点指针
while((p->next!=NULL)&&(j<i))
{
j++;
p=p->next;
}
if(j==i)
{
fflush(stdout);
printf("search successful!");
return p;
}
else return NULL;
}
/*求链表长度*/
int listlenght(Linklist L){
Node*p=L->next;
int j=0;
while(p!=NULL)
{
p=p->next;
j++;
}
return j;
}
/*按值查找*/
Node * valuekey(Linklist L,char key)
{
printf("\nstrat query:");
fflush(stdout);
Node*p=L->next;
printf("here");
fflush(stdout);
if(p->data!=key)
p=p->next;
else {
printf("OK");
fflush(stdout);
return p;
}
}
int main(void){
int i;
char key;
Node*p=NULL;
Node*m;
Linklist L=initiallist(L);//初始化单链表
createhead(L);//头插法建表
print(L);//输出表
printf("The length of this list is %d",listlenght(L));
/*
* 尾插法建表
createtail(L);
print(L);
*/
/*找表中第i个节点并输出*/
fflush(stdout);//立即输出
scanf("%d",&i);
getchar();
p=geti(L,i);
printf("%2c\n",p->data);
fflush(stdout);
free(p);
/*找表中值为key的节点并输出*/
system("cls");
printf("please input the key:");
fflush(stdout);
scanf("%c",&key);
getchar();
printf("%c",key);
fflush(stdout);
m=valuekey(L,key);
printf("Query successful!--%c--",m->data);
fflush(stdout);
return 0;
}
调试结果
initial successful!
125485$
5 8 4 5 2 1
The length of this list is 62
search the 2 node is:search successful! 8
please input the key:8
8
strat query:hereQuery successful!--8--