C语言 结构链表 - 如何编辑数据


这是我

的结构和我添加的节点。 我的插入功能还可以,但是当我稍后尝试添加Course_Student数据时,通过搜索学生的 uId 并将数据添加到该特定节点; 我的列表被删除了,它什么也没显示. 然后当我添加另一个节点时,Course_Student数据以奇怪的方式显示。以后如何将我的Course_Student数据添加到一个特定节点?

typedef struct stdnt Student ;
typedef struct crs_std Course_Student;
struct crs_std{  
    int crs_code;
    char name[20];
    float grade;
    int unt;
};
struct stdnt { 
       char firstname[20];
       char lastname[20];
       Course_Student a[10];
       unsigned long long uID;
       int year;
       float avg;
};
struct Linked_list_Student{
    Student s;
    Node_s *next_s ;

这是我在插入数据后用于将数据添加到链表中的函数。

void Select_Course(NodePtr_s *startPtr_s, Course_Student cs[10], int id){
    int i;
    NodePtr_s prevPtr_s;
    NodePtr_s currPtr_s;
    for(i=0;i<n;i++){
        if((*startPtr_s)->s.uID == id){
            (*startPtr_s)->s.a[i].crs_code = cs[i].crs_code;
            strcpy((*startPtr_s)->s.a[i].name,cs[i].name);
            (*startPtr_s)->s.a[i].unt = cs[i].unt;
        }
        prevPtr_s = (*startPtr_s);
        currPtr_s = (*startPtr_s)->next_s;
        while(currPtr_s != NULL){
            if(currPtr_s->s.uID == id){
                currPtr_s->s.a[i].crs_code = cs[i].crs_code;
                strcpy(currPtr_s->s.a[i].name,cs[i].name);
                currPtr_s->s.a[i].unt = cs[i].unt;
        }
        prevPtr_s = currPtr_s;
        currPtr_s = currPtr_s->next_s;
        }

    }
}

在你的 for 循环中:

for(i=0;i<n;i++){

。什么是N? 看起来 n 可能是全局设置为 10,用于循环通过 cs? 如果是这样,那么您的方法不是最好的。 看来你是:

foreach element in cs
    find the correct student record
    add that element from cs to the student record

但听起来 cs 中的所有元素都应该添加到同一个学生记录中? 如果是这样,你真的应该做:

find the correct student record
foreach element in cs
    add that element to the student record

请验证这是您要实现的目标,然后我或这里的其他人可以帮助您使用正确的算法。

另外,请确保您的缩进正确,以便人们可以轻松阅读您的代码:

    while(currPtr_s != NULL){
        if(currPtr_s->s.uID == id){
            currPtr_s->s.a[i].crs_code = cs[i].crs_code;
            strcpy(currPtr_s->s.a[i].name,cs[i].name);
            currPtr_s->s.a[i].unt = cs[i].unt;
    }
    prevPtr_s = currPtr_s;
    currPtr_s = currPtr_s->next_s;
    }

应该是

    while(currPtr_s != NULL){
        if(currPtr_s->s.uID == id){
            currPtr_s->s.a[i].crs_code = cs[i].crs_code;
            strcpy(currPtr_s->s.a[i].name,cs[i].name);
            currPtr_s->s.a[i].unt = cs[i].unt;
        }
        prevPtr_s = currPtr_s;
        currPtr_s = currPtr_s->next_s;
    }
你应该

使用你的startPtr_s来初始化你的循环,并对你的临时变量使用Node_s

void Select_Course(NodePtr_s *startPtr_s, Course_Student cs[10], int id)
{
  Node_s *current = NULL;
  int i;
  /* iterate on each node in your list */
  for (current = *startPtr_s; current != NULL; current = current->next_s) {
    if (current->s.uID != id) continue;
    /* On each node update your data */
    for (i = 0; i < n; i++) {
      current->s.a[i].crs_code = cs[i].crs_code;
      strcpy(current->s.a[i].name,cs[i].name);
      current->s.a[i].unt = cs[i].unt;
    }
  }
}

最新更新