C語言中鏈表任意位置怎么插入數據?然后寫入文件中?


鏈表插入示意圖:(圖是個人所畫)因為鏈表指針指來指去,難以理解,所以輔助畫圖更加方便。

 

插入某個學號后面圖:

 

 

 

定義的結構體:

struct student
{  
char ID[11]; //學生學號
char name[20];  //學生姓名
 
struct student *next;  //next 指針 指向 struct  student 類型的變量
}stu;

 

 

 插入到某個學號后面,但不能插入到第一個節點的前面!

/***************

函數功能:
插入學生
返回:指向鏈表表頭的指針

/***************/

void  insert_message(struct student* head)
{       
       FILE* fp; //定義文件指針
       
       struct student* pointer,*q,*temp;   // p指針指向新節點  q指向插入節點的地方
       
       fp=fopen("student.txt","wb+");
          
       pointer=head->next;//跳過頭結點 指向下一個節點
        
       InputBox(stu.ID,11,"請輸入要插入哪個學號后面");
       
       while(pointer!=NULL)
       { 
           if(strcmp(pointer->ID,stu.ID)==0) //假設要插入到1后面,輸入1
           {  
               fwrite(pointer,sizeof(struct student),1,fp); //先把1節點寫入文件
                      
               q = (struct student *)malloc(sizeof(struct student)); //開辟新節點內存
               
               InputBox(stu.ID,11,"請輸入學生學號");     
               strcpy(q->ID,stu.ID);
               
               InputBox(stu.name,20,"請輸入學生姓名");
               strcpy(q->name,stu.name);
                
               temp= pointer->next;  //將原來的 1后面的數據 2 賦值給臨時temp結構體變量
                    
               pointer->next = q;  //將q節點 賦值給 原來2的位置
               
               pointer=pointer->next; //將q節點數據(pointer->next 等於q) 賦值給p 好讓p節點寫入文件

               fwrite(pointer,sizeof(struct student),1,fp);//寫入輸入的q節點數據
             
               pointer->next=temp; //將原來2位置的數據賦值到 p的下個節點(由於上個代碼p=p->next)p被賦值p->next

               pointer=pointer->next; //p總是指向新的節點
               
               while(pointer!=NULL)
               {fwrite(pointer,sizeof(struct student),1,fp);  //將其他各節點遍歷寫入文件
               pointer=pointer->next;
               }
               fclose(fp);
               outtext("插入學生成功!");
               
           }
           fwrite(pointer,sizeof(struct student),1,fp);  //事先開始遍歷節點寫入文件
            pointer=pointer->next;
}  
 
}

 

任意位置插入 圖:

 

 

代碼這么一改,任意位置的插入:

 

/***************

函數功能:
插入出勤學生
返回:指向鏈表表頭的指針

/***************/

void  insert_message(struct student* head)
{       
       FILE* fp; //定義文件指針
       
       struct student* pointer,*q,*temp;   // p指針指向新節點  q指向插入節點的地方
       
       fp=fopen("student.txt","wb+");
          
       pointer=head->next;//跳過頭結點 指向下一個節點
        
       InputBox(stu.ID,11,"請輸入要插入哪個學號位置?");
       
       while(pointer!=NULL)
       { 
           if(strcmp(pointer->ID,stu.ID)==0) //輸入要插入到哪個位置?
           {  
                      
               q = (struct student *)malloc(sizeof(struct student)); //開辟新節點內存
               
               InputBox(stu.ID,11,"請輸入學生學號");     
               strcpy(q->ID,stu.ID);
               
               InputBox(stu.name,20,"請輸入學生姓名");
               strcpy(q->name,stu.name);

               temp=pointer; //將原來的  數據  賦值給臨時temp結構體變量
            
               pointer = q;//將q節點 賦值給 原來2的位置

               fwrite(pointer,sizeof(struct student),1,fp);//寫入輸入的q節點數據
             
               pointer->next=temp; //將原來2位置的數據賦值到 p的下個節點

               pointer=pointer->next; //p總是指向新的節點
               
               while(pointer!=NULL)
               {fwrite(pointer,sizeof(struct student),1,fp);  //將其他各節點遍歷寫入文件
               pointer=pointer->next;
               }
               fclose(fp);
               outtext("插入學生成功!");
              
           }
           fwrite(pointer,sizeof(struct student),1,fp);  //事先開始遍歷節點寫入文件
            pointer=pointer->next;
}  
 
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM