typedef struct Clinklist//struct关键字,定义的一个“结构类型” Clinjlist是结构名
{
int data; //数据域
struct Clinklist *next;//指针域
}node;//定义结构变量node,对成员的访问可以用例如node.data
void ds_init(node **pNode)//*pNode为一结点、、、、、、、、、、。。。 **pNode 表示元素
/*两个星号叫做“二级指针”,意思就是指向指针的指针。
如果是一级指针,node *Pr,那么Pr是指向一个node结构,而node **Pr2,那么Pr2指向一个指针,而那个指针又指向一个node结构。*/
{
int item;
node *temp;//定义两个结点
node *target;
printf("输入结点的值,输入0完成初始化\n");
while(1)
{
scanf("%d",&item);
fflush(stdin);//清空输入缓冲区
if(item==0)
return ;//return ;和break;都可以跳出循环,终止
if((*pNode)==NULL)//若成立,循环链表中只有一个结点,*pNode表示地址,地址不为空则执行下去
{
{
*pNode=(node*)malloc(sizeof(struct Clinklist));//动态分配结点类型,因为node *temp,sizeof后为分配单位
if(!(*pNode))//如果pNode为空,则!pNode为真,会执行下去
exit(0); //退出程序并返回一个0值
(*pNode)->data=item;//不用退出时,执行的语句
(*pNode)->next=*pNode;//就是循环起来建立链表
}
}
else
{
//找到next 指向第一个结点的结点
for(target=(*pNode);target->next!=(*pNode);target=target->next)//中间那个就是相当于判断head->next!=head,直到head->next=head时终止
; // target 是最后一个结点,尾部 指向pNode第一个结点,都是在最尾部插入,怎样判断最尾部
temp=(node*)malloc(sizeof(struct Clinklist));
if(!temp)
exit(0);//如果生成失败则退出
temp->data=item;
temp->next=*pNode;//指向第一个结点,说明是一个循环
target->next=temp;//第一次确定头部就是temp
}
}
}
//插入结点
void ds_insert(node **pNode,int i)
{
node *temp;
node *target;
node *p;
int item;
int j=1;
printf("输入要插入结点的值");
scanf("%d",&item);
if(i==1)//新插入结点作为一个结点
{
temp=(node*)malloc(sizeof(struct Clinklist));
if(!temp)
exit(0);
temp->data-item;//寻找最后一个结点
for(target=(*pNode);target->next!=(*pNode);target=target->next)
;
temp->next=(*pNode);
target->next=temp;
*pNode=temp;
}
else
{
target=*pNode;
for(;j<i-1;j++)
{
target=target->next;
}
temp=(node*)malloc(sizeof(struct Clinklist));
if(!temp)
exit(0);// ?????????????????????????????
temp->data=item;
p=target->next;
target->next=temp;
temp->next=p;
}
}
void ds_delete(node **pNode,int i)
{
node *target;
node *temp;
int j=1;
if(i=1)//s删除第一个结点,找到最后一个
{
for(target=*pNode;target->next!=*pNode;target=target->next)
temp=*pNode;
*pNode=(*pNode)->next;
target->next=*pNode;
free(temp);
}
else
{
target=*pNode;
for(;j<i-1;++i)
{target=target->next;}
temp=target->next;
target->next=temp->next;
free(temp);
}
}
int ds_search(node *pNode,int elem)
{
node *target;
int i=1;
for(target=pNode;target->data!=elem&&target->next!=pNode;++i)
{
target=target->next;
}
if(target->next==pNode)
//if(target->next==pNode)
//表中不存在该元素
return 0;
else
return i;
}
void ds_traverse(node *pNode)
{
node *temp;
temp=pNode;
printf("*********************表中元素*************************\n");
do
{
printf("%d\t",temp->data);
}
while((temp=temp->next)!=pNode);
printf("\n");
}
int main()
{
node *pNode=NULL;
char opp;
int find;
printf("..............\n\n");
printf("1初始化链表\n\n2插入结点\n\n3删除结点\n\n4返回结点位置\n\n5遍历链表\n\n0退出\n\n请选择操作\n");
while(opp!="0")
{
scanf("%c",&opp);
switch(opp)
{
case '1':
ds_init(&pNode);
printf("\n");
ds_traverse(pNode);
break;
case '2':
printf("输入需要插入结点位置");
scanf("%d",&find);
ds_insert(&pNode,find);
printf("在位置%d插入值后:\n",find);
ds_traverse(pNode);
printf("\n");
break;
case'3':
printf("输入需要删除结点的位置");
scanf("%d",&find);
ds_delete(&pNode,find);
printf("删除第%d个结点后:\n",find);
ds_traverse(pNode);
printf("\n");
break;
case '4':
printf("你要查找倒数第几个结点的值");
scanf("%d",&find);
printf("元素%d所在位置为%d\n",find,ds_search(pNode,find));
printf("\n");
break;
case'5':
ds_traverse(pNode);
printf("\n");
break;
case'0':
exit(0);
}
}
return 0;
}