我写了一个程序,它有很多功能,但是我不能在链表中交换2个节点的2个元素。实际上我可以通过改变它们的链接交换2个节点但是当用户请求2个元素交换时我不能交换2个元素。这是我的代码,没有任何交换操作。我不得不说我想通过交换2节点元素而不改变节点链接来做这个交换操作。我怎么能摆脱这个问题?任何帮助将不胜感激。
#include <stdio.h>
#include <stdlib.h>
struct node{
int data;
struct node *next;
};
typedef struct node nodetype;
void insert(int ,struct node **);
void display(struct node *);
void search(int, struct node *);
void delete(int, struct node **);
int main(void){
nodetype *p;
p=NULL;
int x=0,choice;
int s_no,k,r_no;
while(x!=1){
printf("enter 1 for insert\n");
printf("enter 2 for display\n");
printf("enter 3 for search\n");
printf("enter 4 for delete\n");
printf("enter 0 for exit\n");
fflush(stdout);
scanf("%d",&choice);
if(choice==1){
printf("enter inserted no\n");
fflush(stdout);
scanf("%d",&k);
insert(k,&p);
}
else if(choice==2)
display(p);
else if(choice==3){
printf("enter searched no\n");
scanf("%d",&s_no);
search(s_no, p);
}
else if(choice==4){
printf("enter deleted no\n");
scanf("%d",&r_no);
delete(r_no,&p);
}
else
printf("invalid choice\n");
}
return 0;
}
void display ( struct node *p)
{
printf("the content is:\n");
if(p==NULL)
printf("the link is empty\n");
while ( p != NULL )
{
printf ( "%d ", p -> data ) ;
p = p -> next ;
}
printf ( "\n" ) ;
}
void search(int no, struct node *p){
nodetype * loc;
for(loc=p;loc!=NULL;loc=loc->next)
{
if(no==loc->data){
printf("\nthe number exist in the list\n");
return;
}
}
printf("\nthe number is not exist in the \n");
}
void insert(int x,struct node **p)
{
struct node *r,*temp=*p;
r = (struct node *)malloc ( sizeof (struct node)) ;
r ->data = x ;
r->next=NULL;
if ( *p == NULL)
{
*p = r ;
}
else
{
while(temp->next!= NULL)
{
temp=temp->next;
}
temp->next=r;
}
}
void delete(int num, struct node **p){
struct node *temp,*x;
temp=*p;
x= NULL;
while (temp->next !=NULL){
if(temp->data == num)
{
if (x==NULL)
{
*p = temp->next;
free(temp);
return;
}
else
{
x->next = temp->next;
free(temp);
return;
}
}
x=temp;
temp=temp->next;
}
printf(" No such entry to delete ");
}
答案 0 :(得分:1)
我尝试使用交换操作 用户输入的数字。例如, 用户输入12和45以便 交换链表。我该怎么办? 是什么?
我建议你用返回值扩展现有函数,(不测试只是想法)
nodetype * search(int no, struct node *p){
nodetype * loc;
for(loc=p;loc!=NULL;loc=loc->next)
{
if(no==loc->data){
printf("\nthe number exist in the list\n");
return loc;
}
}
printf("\nthe number is not exist in the \n");
return NULL;
}
之后,您将调用搜索用户输入的两个值。 然后在不更改任何指针引用的情况下交换值,只需分配新值即可。当然,您需要检查节点是否实际被找到(不是NULL)。
nodetype *node1;
nodetype *node2;
node1 = search( userInput1, &p );
node2 = search( userInput2, &p );
int tmp_data = node1->data;
node1->data = node2->data;
node2->data = tmp;