C 寻找不同的逻辑

C 寻找不同的逻辑,c,ubuntu,codeblocks,C,Ubuntu,Codeblocks,所以我写了这段未完成但有效的代码。我是一个编程新手,我认为我的逻辑是错误的(尽管代码运行正常),因为有太多的“ifs和else”,我想不出另一个工作逻辑来将数据插入链表的任何位置,并输出数据+错误处理,如果位置无效,我试图发展计算思维 有些事情告诉我,这段代码可以写得更好 #include <stdio.h> #include <stdlib.h> struct node { int data; struct node* next; }; struct

所以我写了这段未完成但有效的代码。我是一个编程新手,我认为我的逻辑是错误的(尽管代码运行正常),因为有太多的“ifs和else”,我想不出另一个工作逻辑来将数据插入链表的任何位置,并输出数据+错误处理,如果位置无效,我试图发展计算思维 有些事情告诉我,这段代码可以写得更好

#include <stdio.h>
#include <stdlib.h>

struct node {
    int data;
   struct node* next;
};

struct node* head = NULL;


void Insert(int c ,int e)
{
    int i;
    static int p = 1;
    struct node* temp = malloc(sizeof(struct node));
    temp -> data = c;
    temp -> next = NULL;
   struct node* temp1 = head;

    if (e > p+1)
    {
        printf("Invalid Position");
        return;
    }

   else if (head == NULL)
        {
        head = temp;
        return;
        }

    else if (e <= 1)
    {
        temp -> next = head;
        head = temp;
        return;
    }

    else if (e == 2)
    {
        if (temp1 -> next != NULL)
        {
            temp -> next = temp1 -> next;
            temp1 -> next = temp;

        }

        else
        {
            temp1 -> next = temp;

        }

    }

    else
    {
        for (i = 0;i<e-2;i++)
        {
            temp1 = temp1 -> next;
        }

    temp -> next = temp1 -> next;
    temp1 -> next = temp;
    }
p++;
}

void print() {

    struct node* temp = head;
    printf("list is: \n");
    while (temp != NULL) {

        printf( "%d ,",temp->data);
        temp = temp->next;
    }
}


int main () {

printf("How Many Numbers?\n");
int a ,b ,c, e;
scanf("%d" , &b);
for(a = 0;a<b;a++) {
    printf("Enter the numbers \n");
    scanf("%d",&c);
    printf("Enter position \n");
    scanf("%d",&e);
    Insert(c , e);
    print();
}
return 0;
}
#包括
#包括
结构节点{
int数据;
结构节点*下一步;
};
结构节点*head=NULL;
空白插入(内部c、内部e)
{
int i;
静态int p=1;
结构节点*temp=malloc(sizeof(结构节点));
温度->数据=c;
temp->next=NULL;
结构节点*temp1=头部;
如果(e>p+1)
{
printf(“无效位置”);
返回;
}
else if(head==NULL)
{
压头=温度;
返回;
}
否则,如果(e next=头部;
压头=温度;
返回;
}
else如果(e==2)
{
if(temp1->next!=NULL)
{
temp->next=temp1->next;
temp1->next=temp;
}
其他的
{
temp1->next=temp;
}
}
其他的
{
对于(i=0;i下一步;
}
temp->next=temp1->next;
temp1->next=temp;
}
p++;
}
作废打印(){
结构节点*温度=头部;
printf(“列表为:\n”);
while(temp!=NULL){
printf(“%d”,临时->数据);
温度=温度->下一步;
}
}
int main(){
printf(“多少个数字?\n”);
INTA、b、c、e;
scanf(“%d”和“b”);

对于(a=0;aYes),您可以通过将两个条件组合为一,将深度降低一级:

    if (e > p + 1) {
        printf("Invalid Position");
        return;
    }
    else if (head == NULL) {
        head = temp;
        return;
    }
    else if (e <= 1) {
        temp->next = head;
        head = temp;
        return;
    }
    else if (e == 2 && temp1->next != NULL) {
        temp->next = temp1->next;
        temp1->next = temp;

    }
    else if (temp1->next == NULL) {
        temp1->next = temp;

    }
    else {
        for (i = 0; i < e - 2; i++) {
            temp1 = temp1->next;
        }
        temp->next = temp1->next;
        temp1->next = temp;
    }
if(e>p+1){
printf(“无效位置”);
返回;
}
else if(head==NULL){
压头=温度;
返回;
}
否则,如果(e next=头部;
压头=温度;
返回;
}
else if(e==2&&temp1->next!=NULL){
temp->next=temp1->next;
temp1->next=temp;
}
else if(temp1->next==NULL){
temp1->next=temp;
}
否则{
对于(i=0;inext;
}
temp->next=temp1->next;
temp1->next=temp;
}

是的,您可以通过将两个条件组合为一个来将深度降低一级:

    if (e > p + 1) {
        printf("Invalid Position");
        return;
    }
    else if (head == NULL) {
        head = temp;
        return;
    }
    else if (e <= 1) {
        temp->next = head;
        head = temp;
        return;
    }
    else if (e == 2 && temp1->next != NULL) {
        temp->next = temp1->next;
        temp1->next = temp;

    }
    else if (temp1->next == NULL) {
        temp1->next = temp;

    }
    else {
        for (i = 0; i < e - 2; i++) {
            temp1 = temp1->next;
        }
        temp->next = temp1->next;
        temp1->next = temp;
    }
if(e>p+1){
printf(“无效位置”);
返回;
}
else if(head==NULL){
压头=温度;
返回;
}
否则,如果(e next=头部;
压头=温度;
返回;
}
else if(e==2&&temp1->next!=NULL){
temp->next=temp1->next;
temp1->next=temp;
}
else if(temp1->next==NULL){
temp1->next=temp;
}
否则{
对于(i=0;inext;
}
temp->next=temp1->next;
temp1->next=temp;
}

当然if和else不是一个好的模式设计,但您应该在C中使用它。当您使用OOP(面向对象编程)语言时,您可以更改您的设计


在C语言中,你应该有一个模块化的代码,所以只要尽可能地用函数生成代码的较小部分。

当然,如果和其他不是一个好的模式设计,但你应该在C语言中使用它。当你使用OOP(面向对象编程)语言时,你可以改变你的设计


在C语言中,你应该有一个模块化的代码,所以只要尽可能地用函数生成代码的较小部分。

你的
插入
函数可以简化一点。基本上,你需要考虑三个条件:

  • 将第一节点插入空列表中
  • 插入新的第一个节点;以及
  • 在第一个和最后一个节点之间插入新节点
  • 默认情况下,在末尾插入,无需特别考虑。对每一项单独编码,您可以按如下方式重写
    insert

    void insert (int c, int e)
    {
        struct node *temp = malloc (sizeof *temp);
        if (!temp) {
            fprintf (stderr, "error: virtual memory exhausted.\n");
            exit (EXIT_FAILURE);
        }
    
        temp->data = c;
        temp->next = NULL;
    
        if (!head) { head = temp; goto check; }  /* empty list */
    
        struct node *iter = head;
    
        if (!e) { temp->next = head; head = temp; return; } /* new 1st node */
        for (--e; e && iter->next; iter = iter->next, e--) {}    /* iterate */
    
        /* inserting before end, update temp->next */
        if (iter->next) temp->next = iter->next;
        iter->next = temp;     /* add node as next */
    
      check:;
        if (e)
            fprintf (stderr, "warning, 'e' beyond list, inserted at end.\n");
    }
    
    #include <stdio.h>
    #include <stdlib.h>
    
    struct node {
        int data;
        struct node *next;
    };
    
    struct node *head = NULL;
    
    void insert (int c, int e);
    void print ();
    void delete ();
    
    int main (void) {
    
        int a, b, c, e, rtn;
        a = b = c = e = rtn = 0;
    
        printf ("\nDefine list, values and positons (zero based positions)\n\n");
        do {
            printf (" numer of list elements?: ");
            if ((rtn = scanf ("%d", &b)) != 1 || b < 1)
                fprintf (stderr, "error: invalid input.\n");
            if (rtn == EOF) exit (EXIT_FAILURE);
        } while (b < 1);
    
        for (a = 0; a < b; a++) {
            do printf ("\n  number %2d: ", a + 1);
            while ((rtn = scanf ("%d", &c)) != 1 && rtn != EOF);
            if (rtn == EOF) exit (EXIT_FAILURE);
    
            do printf ("  position : ");
            while ((rtn = scanf ("%d", &e)) != 1 && e >= 0 && rtn != EOF);
            if (rtn == EOF) exit (EXIT_FAILURE);
    
            insert (c, e);
            print ();
        }
        delete ();
        return 0;
    }
    
    void insert (int c, int e)
    {
        struct node *temp = malloc (sizeof *temp);
        if (!temp) {
            fprintf (stderr, "error: virtual memory exhausted.\n");
            exit (EXIT_FAILURE);
        }
    
        temp->data = c;
        temp->next = NULL;
    
        if (!head) { head = temp; goto check; }  /* empty list */
    
        struct node *iter = head;
    
        if (!e) { temp->next = head; head = temp; return; } /* new 1st node */
        for (--e; e && iter->next; iter = iter->next, e--) {}    /* iterate */
    
        /* inserting before end, update temp->next */
        if (iter->next) temp->next = iter->next;
        iter->next = temp;     /* add node as next */
    
      check:;
        if (e)
            fprintf (stderr, "warning, 'e' beyond list, inserted at end.\n");
    }
    
    void print ()
    {
        struct node *temp = head;
        printf (" current list is: ");
        while (temp != NULL) {
            printf (" %d", temp->data);
            temp = temp->next;
        }
        putchar ('\n');
    }
    
    void delete ()
    {
        struct node *tmp = head;
        while (tmp != NULL) {
            struct node *victim = tmp;
            tmp = tmp->next;
            free (victim);
        }
    }
    
    注意:
    insert
    用于代替
    insert
    。C避免
    Caps
    caMelCase
    用于变量名和函数名,而支持所有小写。参见例如

    如果您正在为列表分配内存,则应跟踪已分配的内存,以便在不再需要时释放。尽早养成良好习惯,不要简单地依赖于退出。您已经编写了
    print()
    ,而
    delete()
    实际上是相同的:

    void delete ()
    {
        struct node *tmp = head;
        while (tmp != NULL) {
            struct node *victim = tmp;
            tmp = tmp->next;
            free (victim);
        }
    }
    
    将所有部分放在一起,稍微清理一下代码的其余部分,您可以将示例重写如下:

    void insert (int c, int e)
    {
        struct node *temp = malloc (sizeof *temp);
        if (!temp) {
            fprintf (stderr, "error: virtual memory exhausted.\n");
            exit (EXIT_FAILURE);
        }
    
        temp->data = c;
        temp->next = NULL;
    
        if (!head) { head = temp; goto check; }  /* empty list */
    
        struct node *iter = head;
    
        if (!e) { temp->next = head; head = temp; return; } /* new 1st node */
        for (--e; e && iter->next; iter = iter->next, e--) {}    /* iterate */
    
        /* inserting before end, update temp->next */
        if (iter->next) temp->next = iter->next;
        iter->next = temp;     /* add node as next */
    
      check:;
        if (e)
            fprintf (stderr, "warning, 'e' beyond list, inserted at end.\n");
    }
    
    #include <stdio.h>
    #include <stdlib.h>
    
    struct node {
        int data;
        struct node *next;
    };
    
    struct node *head = NULL;
    
    void insert (int c, int e);
    void print ();
    void delete ();
    
    int main (void) {
    
        int a, b, c, e, rtn;
        a = b = c = e = rtn = 0;
    
        printf ("\nDefine list, values and positons (zero based positions)\n\n");
        do {
            printf (" numer of list elements?: ");
            if ((rtn = scanf ("%d", &b)) != 1 || b < 1)
                fprintf (stderr, "error: invalid input.\n");
            if (rtn == EOF) exit (EXIT_FAILURE);
        } while (b < 1);
    
        for (a = 0; a < b; a++) {
            do printf ("\n  number %2d: ", a + 1);
            while ((rtn = scanf ("%d", &c)) != 1 && rtn != EOF);
            if (rtn == EOF) exit (EXIT_FAILURE);
    
            do printf ("  position : ");
            while ((rtn = scanf ("%d", &e)) != 1 && e >= 0 && rtn != EOF);
            if (rtn == EOF) exit (EXIT_FAILURE);
    
            insert (c, e);
            print ();
        }
        delete ();
        return 0;
    }
    
    void insert (int c, int e)
    {
        struct node *temp = malloc (sizeof *temp);
        if (!temp) {
            fprintf (stderr, "error: virtual memory exhausted.\n");
            exit (EXIT_FAILURE);
        }
    
        temp->data = c;
        temp->next = NULL;
    
        if (!head) { head = temp; goto check; }  /* empty list */
    
        struct node *iter = head;
    
        if (!e) { temp->next = head; head = temp; return; } /* new 1st node */
        for (--e; e && iter->next; iter = iter->next, e--) {}    /* iterate */
    
        /* inserting before end, update temp->next */
        if (iter->next) temp->next = iter->next;
        iter->next = temp;     /* add node as next */
    
      check:;
        if (e)
            fprintf (stderr, "warning, 'e' beyond list, inserted at end.\n");
    }
    
    void print ()
    {
        struct node *temp = head;
        printf (" current list is: ");
        while (temp != NULL) {
            printf (" %d", temp->data);
            temp = temp->next;
        }
        putchar ('\n');
    }
    
    void delete ()
    {
        struct node *tmp = head;
        while (tmp != NULL) {
            struct node *victim = tmp;
            tmp = tmp->next;
            free (victim);
        }
    }
    

    如果您有任何问题,请仔细查看并告诉我。

    您的
    插入功能可以简化一点。基本上,您需要考虑三个条件:

  • 将第一节点插入空列表中
  • 插入新的第一个节点;以及
  • 在第一个和最后一个节点之间插入新节点
  • 默认情况下,在末尾插入,无需特别考虑。对每一项单独编码,您可以按如下方式重写
    insert

    void insert (int c, int e)
    {
        struct node *temp = malloc (sizeof *temp);
        if (!temp) {
            fprintf (stderr, "error: virtual memory exhausted.\n");
            exit (EXIT_FAILURE);
        }
    
        temp->data = c;
        temp->next = NULL;
    
        if (!head) { head = temp; goto check; }  /* empty list */
    
        struct node *iter = head;
    
        if (!e) { temp->next = head; head = temp; return; } /* new 1st node */
        for (--e; e && iter->next; iter = iter->next, e--) {}    /* iterate */
    
        /* inserting before end, update temp->next */
        if (iter->next) temp->next = iter->next;
        iter->next = temp;     /* add node as next */
    
      check:;
        if (e)
            fprintf (stderr, "warning, 'e' beyond list, inserted at end.\n");
    }
    
    #include <stdio.h>
    #include <stdlib.h>
    
    struct node {
        int data;
        struct node *next;
    };
    
    struct node *head = NULL;
    
    void insert (int c, int e);
    void print ();
    void delete ();
    
    int main (void) {
    
        int a, b, c, e, rtn;
        a = b = c = e = rtn = 0;
    
        printf ("\nDefine list, values and positons (zero based positions)\n\n");
        do {
            printf (" numer of list elements?: ");
            if ((rtn = scanf ("%d", &b)) != 1 || b < 1)
                fprintf (stderr, "error: invalid input.\n");
            if (rtn == EOF) exit (EXIT_FAILURE);
        } while (b < 1);
    
        for (a = 0; a < b; a++) {
            do printf ("\n  number %2d: ", a + 1);
            while ((rtn = scanf ("%d", &c)) != 1 && rtn != EOF);
            if (rtn == EOF) exit (EXIT_FAILURE);
    
            do printf ("  position : ");
            while ((rtn = scanf ("%d", &e)) != 1 && e >= 0 && rtn != EOF);
            if (rtn == EOF) exit (EXIT_FAILURE);
    
            insert (c, e);
            print ();
        }
        delete ();
        return 0;
    }
    
    void insert (int c, int e)
    {
        struct node *temp = malloc (sizeof *temp);
        if (!temp) {
            fprintf (stderr, "error: virtual memory exhausted.\n");
            exit (EXIT_FAILURE);
        }
    
        temp->data = c;
        temp->next = NULL;
    
        if (!head) { head = temp; goto check; }  /* empty list */
    
        struct node *iter = head;
    
        if (!e) { temp->next = head; head = temp; return; } /* new 1st node */
        for (--e; e && iter->next; iter = iter->next, e--) {}    /* iterate */
    
        /* inserting before end, update temp->next */
        if (iter->next) temp->next = iter->next;
        iter->next = temp;     /* add node as next */
    
      check:;
        if (e)
            fprintf (stderr, "warning, 'e' beyond list, inserted at end.\n");
    }
    
    void print ()
    {
        struct node *temp = head;
        printf (" current list is: ");
        while (temp != NULL) {
            printf (" %d", temp->data);
            temp = temp->next;
        }
        putchar ('\n');
    }
    
    void delete ()
    {
        struct node *tmp = head;
        while (tmp != NULL) {
            struct node *victim = tmp;
            tmp = tmp->next;
            free (victim);
        }
    }
    
    注意:
    insert
    用于代替
    insert
    。C避免
    Caps
    caMelCase
    用于变量名和函数名,而支持所有小写。参见例如

    如果您正在为列表分配内存,则应跟踪已分配的内存,以便在不再需要时释放。尽早养成良好习惯,不要简单地依赖于退出。您已经编写了
    print()
    ,而
    delete()
    实际上是相同的:

    void delete ()
    {
        struct node *tmp = head;
        while (tmp != NULL) {
            struct node *victim = tmp;
            tmp = tmp->next;
            free (victim);
        }
    }
    
    将所有部分放在一起,稍微清理一下代码的其余部分,您可以将示例重写如下:

    void insert (int c, int e)
    {
        struct node *temp = malloc (sizeof *temp);
        if (!temp) {
            fprintf (stderr, "error: virtual memory exhausted.\n");
            exit (EXIT_FAILURE);
        }
    
        temp->data = c;
        temp->next = NULL;
    
        if (!head) { head = temp; goto check; }  /* empty list */
    
        struct node *iter = head;
    
        if (!e) { temp->next = head; head = temp; return; } /* new 1st node */
        for (--e; e && iter->next; iter = iter->next, e--) {}    /* iterate */
    
        /* inserting before end, update temp->next */
        if (iter->next) temp->next = iter->next;
        iter->next = temp;     /* add node as next */
    
      check:;
        if (e)
            fprintf (stderr, "warning, 'e' beyond list, inserted at end.\n");
    }
    
    #include <stdio.h>
    #include <stdlib.h>
    
    struct node {
        int data;
        struct node *next;
    };
    
    struct node *head = NULL;
    
    void insert (int c, int e);
    void print ();
    void delete ();
    
    int main (void) {
    
        int a, b, c, e, rtn;
        a = b = c = e = rtn = 0;
    
        printf ("\nDefine list, values and positons (zero based positions)\n\n");
        do {
            printf (" numer of list elements?: ");
            if ((rtn = scanf ("%d", &b)) != 1 || b < 1)
                fprintf (stderr, "error: invalid input.\n");
            if (rtn == EOF) exit (EXIT_FAILURE);
        } while (b < 1);
    
        for (a = 0; a < b; a++) {
            do printf ("\n  number %2d: ", a + 1);
            while ((rtn = scanf ("%d", &c)) != 1 && rtn != EOF);
            if (rtn == EOF) exit (EXIT_FAILURE);
    
            do printf ("  position : ");
            while ((rtn = scanf ("%d", &e)) != 1 && e >= 0 && rtn != EOF);
            if (rtn == EOF) exit (EXIT_FAILURE);
    
            insert (c, e);
            print ();
        }
        delete ();
        return 0;
    }
    
    void insert (int c, int e)
    {
        struct node *temp = malloc (sizeof *temp);
        if (!temp) {
            fprintf (stderr, "error: virtual memory exhausted.\n");
            exit (EXIT_FAILURE);
        }
    
        temp->data = c;
        temp->next = NULL;
    
        if (!head) { head = temp; goto check; }  /* empty list */
    
        struct node *iter = head;
    
        if (!e) { temp->next = head; head = temp; return; } /* new 1st node */
        for (--e; e && iter->next; iter = iter->next, e--) {}    /* iterate */
    
        /* inserting before end, update temp->next */
        if (iter->next) temp->next = iter->next;
        iter->next = temp;     /* add node as next */
    
      check:;
        if (e)
            fprintf (stderr, "warning, 'e' beyond list, inserted at end.\n");
    }
    
    void print ()
    {
        struct node *temp = head;
        printf (" current list is: ");
        while (temp != NULL) {
            printf (" %d", temp->data);
            temp = temp->next;
        }
        putchar ('\n');
    }
    
    void delete ()
    {
        struct node *tmp = head;
        while (tmp != NULL) {
            struct node *victim = tmp;
            tmp = tmp->next;
            free (victim);
        }
    }
    

    如果您有任何问题,请查看并告诉我。

    我建议删除ubuntu和codeblocks标签,因为问题与此无关。另外,“输入编号”