Quản lý nhân viên - Danh sách liên kết trong C, C++

Bài tập quản lý nhân viên theo danh sách liên kết trong C, C++ là một ví dụ điển hình về sanh sách liên kết. Việc xây dựng danh sách liên kết để quản lý nhân viên ở bài code dưới đây gửi tới các bạn các hàm để quản lý nhân viên như: thêm, xóa, sửa thông tin nhân viên, code tính bảng lương nhân viên, in bảng lương nhân viên...
Bài tập quản lý nhân viên theo danh sách liên kết trong C
Ở bài code dưới đây là code theo C, Console trong C# cũng tương tự như thế. Các bạn xem một số hàm tham khảo và Download code Full ở cuối bài viết.
- Tất cả các hàm trong bài code đều có ràng buộc.
Ví dụ: thêm, sửa thông tin nhân viên có ràng buộc tuổi, ngày tháng năm sinh,...
Đi vào Code cụ thể:
Hàm Nhập nhân viên:

void nhapNV(NHANVIEN &nv)
{
clrscr();
printf("\n\t Nhap cac thong tin cua nhan vien: Ho lot, ten, ...\n");
fflush(stdin);
printf("\n\t Ho lot : ");
gets(nv.holot);
fflush(stdin);
printf("\n\t Ten : ");
gets(nv.ten);
do{
fflush(stdin);
printf("\n\t Ngay thang nam sinh (ngay/thang/nam): ");
scanf("%d/%d/%d",&nv.ngaysinh.ngay, &nv.ngaysinh.thang,&nv.ngaysinh.nam);
}while(!IsValidDate(nv.ngaysinh.ngay,nv.ngaysinh.thang,nv.ngaysinh.nam));

do{
fflush(stdin);
printf("\n\t Phai (0:Nu, 1:Nam ): ");
scanf("%d" ,&nv.phai);
}while(nv.phai!=0 && nv.phai!=1);

fflush(stdin);
printf("\n\t Noi sinh : ");
gets(nv.noisinh);

fflush(stdin);
printf("\n\t Phu cap :");
scanf("%ld",&nv.phucap);

fflush(stdin);
printf("\n\t Luong co ban :");
scanf("%ld",&nv.luongcb);

fflush(stdin);
printf("\n\t Ngay cong :");
scanf("%d",&nv.ngaycong);

}

Hàm tìm nhân viên:

NODEPTR timNV(NODEPTR dsnv, char key[])
{
NODEPTR p = dsnv;
while (p!=NULL)
{
if(strcmp(p->info.maNV,key)==0) break;
p=p->pNext;
}
return p;
}

Hàm thêm nhân viên

void themNV(NODEPTR &dsnv,NHANVIEN nv)
{
NODEPTR n;
n = new NODE;
n->info = nv;
n->pNext = dsnv;
dsnv = n;
}

Hàm thêm nhiều nhân viên 1 lúc các bạn Download trong Code full nhé.
Hàm xóa nhân viên, sửa thông tin nhân viên, bảng lương nhân viên đã có trong Code Full. 
CODE FULL DOWNLOAD TẠI ĐÂY
chúc các bạn học tập tốt

Hàm đọc và ghi File, bài 2

#include<stdio.h> 
#include<conio.h> 
char c[100]; 
void docfile(int &n

    
FILE *f
    
f=fopen("chua.txt","rt"); 
    
int i=0
    
fscanf(f," %c",&c[i]);//đọc kí tự trước 
    
while(!feof(f))//kiểm tra xem nó cuối tệp chưa 
    
{     
        
printf("\n %d",c[i]); 
        
i++; 
        
fscanf(f," %c",&c[i]); 
    } 
    
c[i]='\0'
    
n=i
    
fclose(f); 
void ghifile(int n

    
FILE *f
    
f=fopen("taofilekq.txt","wt"); 
    
int i=0
    while(
i<n
    { 
        if(
c[i]>0&&c[i]!=32
        { 
                { 
                
fprintf(f,"%d \n",c[i]); 
                } 
        } 
        
i++; 
    } 
    
fclose(f); 

void main() 
{     
    
int n
    
docfile(n); 
    
ghifile(n); 
}  

Các hàm đọc File trong C, bài 1

#include <stdio.h>
#include <conio.h>


#define MAX 10

char filename[] = "nguyen.txt";

void main()
{
  int mang[MAX][MAX], i, j;  clrscr();
  FILE *fp;

  if ((fp = fopen(filename, "r")) == NULL)
    printf("\nKhong the mo tap tin %s", filename);
  else
  {
    fread(&mang, sizeof(int), MAX * MAX, fp);
    fclose(fp); 
    printf("\nViec doc hoan tat.");
    for (i=0; i<MAX; i++)
    {
      printf("\n");
      for (j=0; j<MAX; j++)
    printf("%d ", mang[i][j]);
    }
  }

}


Giải thích:
Dạng khai báo của hàm fread là:
int fread (void *buffer,int so_byte,int so_muc,FILE *fp)

Các xử lý file: fopen là mở file, mở rồi, xử lý được dữ liệu(ở đây là fread), thì tiến hành đóng lại (fclose).
fread có thể hiểu là file read (Đọc file)
fread là hàm đọc so_muc (số items, số phần tử) của một file nào đó, mỗi phần tử này có độ lớn là so_byte. Dữ liệu đọc xong thì lưu vào buffer.

Cách nhớ: int fread (void *buffer,int so_byte,int so_muc,FILE *fp)
-> Đọc tệp fp so_muc phần tử với kích thước mỗi phần tử là so_byte byte rồi lưu vào địa chỉ buffer.

Ngăn xếp - Stack, bài 2


Operations on a stack
• initialize(stack)--- clear the stack
• empty(stack)--- check to see if the 
stack is empty
• full(stack)--- check to see if the 
stack is full
• push(el,stack)--- put the element 
elon the top of the stack
• pop(stack)--- take the topmost 
element from the stack
• How to implement a stack?






























stack implementation using structure
• Implementation (c): stack is declared as a 
structurewith two fields: one for storage, 
one for keeping track of the topmost 
position
#define Max 50
typedef int Eltype;
typedef struct StackRec {
Eltype storage[Max];
int top;
};
typedef struct StackRec StackType;











Ngăn xếp - Stack, bài 1


// stack.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// self-referential structure
struct stackNode

char* data;
struct stackNode *pNext;
};

typedef struct stackNode StackNode;
typedef StackNode *StackNodePtr;

// function prototypes
void push( StackNodePtr *pTop, char info[100] );
char* pop( StackNodePtr *pTop);
char isEmpty( StackNodePtr pTop ); 
void printStack( StackNodePtr pCurrent );

int main( void )

StackNodePtr pStack = NULL;
char string1[100];
puts("Enter the string:");
gets(string1);
push( &pStack, string1 );
printStack( pStack );
printf("The popped value is %s", pop(&pStack));
return 0;
}
void push( StackNodePtr *pTop, char info[100] )

StackNodePtr pNew;
pNew =(StackNode*)  malloc( sizeof( StackNode* ) );
if ( pNew != NULL )  

pNew->data = info;
pNew->pNext = *pTop; // insert at top of stack
*pTop = pNew;
}
else
{
printf( "%s not inserted. No memory available.\n", info );
}

char* pop( StackNodePtr *pTop)

StackNodePtr pTemp;
char *sPopValue = {0};
pTemp = *pTop; // attach a pointer to element to be removed
sPopValue = ( *pTop )->data;  
printf("popped item is %s", sPopValue);
*pTop = ( *pTop )->pNext; // remove at top of stack
free( pTemp ); // release this memory and set it free!
return sPopValue;
if(*pTop == NULL)
{
printf("Stack is empty");
}

// output stack contents to the console
void printStack( StackNodePtr pCurrent )

if ( pCurrent == NULL )
{
printf( "The stack is empty.\n\n" );
}
else

printf( "The stack is:\n" );
while ( pCurrent != NULL ) 

printf( "%s -> ", pCurrent->data );
pCurrent = pCurrent->pNext; // move to next element
}
printf( "NULL\n\n" );

}
char isEmpty( StackNodePtr pTop )

return pTop == NULL;
}

Liên kết đơn - Linked List, bài 2

How to set up a linked list
typedef struct list_item {
information in each item
struct list_item *nextptr;
} LIST_ITEM;


 
Address book with linked lists
typedef struct list {
char name[MAXLEN];
char address[MAXLEN];
char phone[MAXLEN];
struct list *next;
} ADDRESS;
ADDRESS *hol= NULL;
/* Set the head of the list */


 Creating a New Node
• Allocate space for a new node.
• Set the next pointer to the value of NULL
• Set the data value for the node.


Adding Nodes to the List
• If the start node is null then the start node
becomes the new node.
• If start is not null then start becomes the
new node‟s next and the start becomes the
new node.


Adding to our address book
void add_to_list (void)
/* Add a new name to our address book */
{
ADDRESS *new_name;
new_name= (ADDRESS *)malloc (sizeof (ADDRESS));
/* CHECK THE MEMORY! */
printf ("Name> ");
fgets (new_name->name, MAXLEN, stdin);
printf ("Address> ");
fgets (new_name->address, MAXLEN, stdin);
printf ("Tel> ");
fgets (new_name->phone, MAXLEN, stdin);
/* Chain the new item into the list */
new_name->next= hol;
hol= new_name;


Search in the Address Book
ADDRESS * search (char *name)
/* look for a particular name in our address book */
{
ADDRESS *p = hol;
while(p != NULL && !strcmp(p->name, name))
{
p = p->next;
}
return p;
}


Delete in the Address Book
void delete(char *name)
/* delete a particular name in our address book */
{
ADDRESS *p = hol;
ADDRESS *q = hol;
if(hol != NULL && strcmp(hol->name, name))
{
hol = hol->next;
p->next = NULL;
free(p);
}
else
{
while(p != NULL && !strcmp(p->name, name))
{
q = p;
p = p->next;
}
q->next = p->next;
p->next = NULL;
free(p);
}
}

Liên kết đơn - Linked List, bài 1

Bài 1: Các code cơ bản về liên kết đơn gắn với bài tập danh sách sinh viên 

#include<stdio.h>
#include<string.h>
#include<alloc.h>


//khoi tao danh sach lien ket

struct  student{
    char *hoten;
    int MSSV;
    struct  student* node;
    };
   
struct  student *head;
 //them mot sinh vien vao dau danh sach
struct student* new;
new = (struct student*)malloc(struct student*);
new->next = head;
head=new;

//duyet danh sach tu mot con tro local

struct student* cur = head;
while(cur != NULL){
    cur=cur->next;
}

//ham push - them sinh vien

void push(struct student** headRef, int data){
    struct student* new= (struct student* )malloc(struct student* );
    new->data = data;
    new->next = *headRef;
    *headRef = new;
}