马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 qq783369750 于 2017-9-4 16:05 编辑
在这里贴上相关部分的代码,1为初始化,7为逆向输出。现在问题是逆向输出第一个元素并不能有效逆向。逆向输出代码我在网上找的,没看懂求大神解释一下谢谢~帮忙运行一下感激涕零了。#include<stdio.h>
#include<stdlib.h>
typedef struct Linklist
{
int n;
struct Linklist *next;
}node;
void list_init(node **p)
{
node *temp;
node *target;
int item;
printf("输入结点的值,输入0完成初始化\n");
while(1)
{
printf("输入结点:");
scanf("%d",&item);
fflush(stdin);
if(item)
{
if((*p)==NULL)
{
*p=(node*)malloc(sizeof(node));
/*if(!(*pNode))
exit(0);*/
(*p)->n=item;
(*p)->next=*p;
}
else
{
for(target=(*p);target->next!=(*p);target=target->next);//这句忘写了,扫描指针用来确定最后一个元素在哪里,不然无法确定最后一个元素
temp=(node*)malloc(sizeof(node));
temp->n=item;
target->next=temp;
temp->next=*p;
}
}
else
{
return;
}
}
}
void list_add(node **p,int i)
{
int j;
int item;
node *target;
node *temp;
node *q;
printf("输入你想要插入的值:");
scanf("%d",&item);
if(i==1)
{
temp=(node*)malloc(sizeof(node));
temp->n=item;
for(target=*p;target->next!=*p;target=target->next);
temp->next=*p;
target->next=temp;
*p=temp;
}
else if(i>1)
{
temp=(node*)malloc(sizeof(node));
temp->n=item;
target=*p;
for(j=1;j<(i-1);j++)
{
target=target->next;
}
q=target->next;
target->next=temp;
temp->next=q;
}
else
{
printf("输入错误");
return;
}
}
void list_del(node **p, int i)
{
node *target;
node *temp;
int j;
temp=*p;
if(i==1)
{
for(target=*p;target->next!=*p;target=target->next);
target->next=target->next->next;
*p=target->next;
free(temp);
}
else if (i>1)
{
target=*p;
for(j=1;j<i;j++)
{
temp=target;
target=target->next;
}
if(target->next==*p)
{
temp->next=*p;
free(target);
}
else
{
temp->next=target->next;
free(target);
}
}
}
void Traverse(node *p)
{
int i;
node *target;
printf("链表为:");
if(p!=NULL)
{
target=p;
do //for(target->next!=p;target=target->next)
{
printf("%d ", target->n);
}
while((target=target->next)!=p);
}
else
{
printf("链表还未创建");
}
}
void list_suchen(node *p,int i)
{
node *target;
int j=1;
//for(target=p;target->next!=p;target=target->next)
target=p;
do
{
if(target->n==i)
{
printf("找到该元素在第%d个结点",j);
}
j++;
}
while((target=target->next)!=p);
/*if(target->n==i)
{
printf("找到该元素在第%d个结点",j);
}*/
}
void list_loesen(node **p)
{
node *temp;
node *target;
for(target=*p;target->next!=*p;target=target->next);
target->next=NULL;
free(*p);
}
int list_count(node *p)
{
int j=1;
node *target;
for(target=p;target->next!=p;target=target->next)
{
j++;
}
return j;
}
void list_l_print(node *p)
{
node *target;
for (target=p;target->next!=p;target=target->next)
{
printf("%d ",target->n);
}
}
void list_r_print(node **p)
{
node *current, *temp;
current=(*p)->next;
if(current!=(*p))
{
temp=current;
current=current->next;
temp->next=(*p);
}
while(current!=(*p))
{
temp=current;
current=current->next;
temp->next=(*p)->next;
(*p)->next=temp;
}
}
int main()
{
node *p=NULL;
char opp;
int find;
int count;
while(opp!='0')
{
scanf("%c",&opp);
switch(opp)
{
case '1':
list_init(&p);
printf("\n");
Traverse(p);
break;
case '2':
printf("输入你想要插入节点的位置:");
scanf("%d",&find);
list_add(&p, find);
printf("\n");
Traverse(p);
break;
case '3':
printf("输入你想要删除节点的位置:");
scanf("%d",&find);
list_del(&p, find);
printf("\n");
Traverse(p);
break;
case '4':
printf("输入你想要查找的值:");
scanf("%d",&find);
list_suchen(p,find);
break;
case '5':
list_loesen(&p);
break;
case '6':
count=list_count(p);
printf("链表一共有%d个元素",count);
break;
case '7' :
list_r_print(&p);
break;
}
}
return 0;
}
输出之后就是这样的
|