LinkedList元素在C中交换问题

时间:2011-03-31 17:25:35

标签: c linked-list swap

我写了一个程序,它有很多功能,但是我不能在链表中交换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 ");
}

1 个答案:

答案 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;