30/09/2018, 19:56

MẢNG VÀ XÂU trong danh sách liên kết đơn

mn giúp mk với. cái dòng nhập tên vào danh sách liên kết đơn báo sai là sao?

#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;

struct sv{
	int masv;
	string ten;
	int diemtoan,diemvan,diemtb;
};
struct node{
	sv data;
	struct node *pNext;
};
typedef struct node Node;
Node *getNode(sv x){
	Node *p;
	if(p==NULL ) return NULL;
	else{
		p->data=x;
		p->pNext=NULL;
	}
	return p;
}
void nhap(sv x,Node *p){
	p = new Node;
	p->pNext = NULL;
	int masv;
	string hoten;
	int diemtoan,diemvan,diemtb;
	cout<<"
 Nhap ma sinh vien: ";
	cin>>masv;
	p->data.masv =masv;
	cout<<"
Ho ten: ";
	getline(cin,hoten);
        strcpy(p->data.ten,hoten);
	cout<<"
Diem toan: ";
	cin>>diemtoan;
	p->data.diemtoan=diemtoan;
	cout<<"		 Diem van: ";	cin>>diemvan;
	p->data.diemvan;
}
int tinhdiemtb(sv x){
	int diemtb;
	diemtb=(x.diemtoan+x.diemvan)/2;
	return diemtb;
}
void in(){
	Node *p;
	int masv;
	string ten;
	int diemtoan,diemvan,diemtb;
	cout << "
" << p->data.ten << "		" << p->data.masv << "
" << "diem toan: " << p->data.diemtoan;
	cout<<"			 diem van: "<<diemvan;
	cout<<"		"<<tinhdiemtb(p->data);
}
 //Em phai lam lai cái ch??ng trình con này, vì nó ko theo ki?u danh sách liên k?t
void thuchien(sv x){
	int n,chon;
	Node *p;
	cout<<"	1-nhap";
	cout<<"
	2- in";
	cout<<"
 moi chon.";
	cin>> chon;
	switch(chon){
		case 1: {
	cout<<"nhap so sinh vien: ";
	cin>>n;
	for(int i=1;i<=n;i++){
		nhap(x,p);
		break;
	}
}
	case 2: for(int i=1;i<=n;i++){
		in();
		break;
		}
	default :cout<<"
chon lai.";
	}
}

int main(){
	sv x;
 		thuchien(x);
}
Dương Nguyễn Văn viết 22:08 ngày 30/09/2018

Bạn khai báo ten , vs hoten la mảng ký tự nhé.
strcpy cần 2 con trỏ kiểu char. chứ k phải string

Ngô Doãn Tuấn viết 22:12 ngày 30/09/2018

Bạn nghĩ sao nếu ứng dụng vector để giải quyết những bài toán như thế này nhỉ

... viết 22:11 ngày 30/09/2018

mk k biết cách dùng vector

... viết 22:01 ngày 30/09/2018

ý là khai báo hai cái kiểu char ạ?

Dương Nguyễn Văn viết 22:00 ngày 30/09/2018

Đúng rồi. Bạn để là mảng char là đc

Ngô Doãn Tuấn viết 21:58 ngày 30/09/2018

Dùng vector dễ hơn và nó cũng dễ ứng dụng
Mình nghĩ vậy.

Phương Lê viết 22:03 ngày 30/09/2018

chung_nguyenChung Nguyễn

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

#include <string.h>
#include <malloc.h>

typedef struct sinh_vien
{
    char ho_ten[20];
    float diem;
    struct sinh_vien *next;
} t_sinh_vien;

t_sinh_vien *head = NULL;

void hoan_vi(char *x, char *y)
{
    char temp[20];
    strcpy(temp, x);
    strcpy(x, y);
    strcpy(y, temp);
}

int main()
{
    t_sinh_vien *sv, *p, *q;
    char ht[20];
    float d, max;
    int n, i;

    printf("So luong sinh vien: ");
    scanf("%d", &n);
    for(i = 1; i <= n; i ++)
    {
        printf("Thong tin sinh vien %d\n", i);
        printf(" Ho ten: ");
        fflush(stdin);
        gets(ht);
        if((sv = (t_sinh_vien *)malloc(sizeof(t_sinh_vien))) == NULL)
        {
            printf("\nKhong du bo nho\n");
            break;
        }
        else
        {
            strcpy(sv->ho_ten, ht);
            printf(" Diem: ");
            scanf("%f", &d);
            sv->diem = d;
            sv->next = NULL;
            if(head == NULL)
                {
                    head = sv;
                    p = sv;
                }
            else
            {
                p = head;
                while(p->next != NULL)
                    p = p->next;
                p->next = sv;
            }
        }
    }

    p = head;
    n = 0;
    printf("\nDanh sach sinh vien\n");
    while(p != NULL)
    {
        printf("%3d %s %5.2f\n", ++ n, p->ho_ten, p->diem);
        p = p->next;
    }

    p = head;
    while(p != NULL)
    {
        q = p->next;
        sv = p;
        while(q != NULL)
        {
            if(strcmp(q->ho_ten, sv->ho_ten) < 0)
                sv = q;
            q = q->next;
        }
        hoan_vi(&sv->ho_ten, &p->ho_ten);
        p = p->next;
    }

    p = head;
    n = 0;
    printf("\nDSSV sap xep theo ten\n");
    while(p != NULL)
    {
        printf("%3d %s\n", ++ n, p->ho_ten);
        p = p->next;
    }

    p = head;
    while(p != NULL)
    {
        if(p->diem > max)
            max = p->diem;
        p = p->next;
    }
    printf("\nDiem Max %.2f\n", max);

    p = head;
    printf("\nHo ten can tim: ");
    fflush(stdin);
    gets(ht);
    while(p != NULL)
    {
        if(strcmp(p->ho_ten, ht) == 0)
        {
            printf("\nTim thay\n");
            break;
        }
        p = p->next;
    }
    if(p == NULL)
        printf("\nKhong tim thay\n"); //

    p = head;
    while(p != NULL)
    {
        q = p->next;
        free(p);
        p = q;
    }

    return 0;
}

... viết 22:09 ngày 30/09/2018

khi khai báo kiểu char thì lệnh getline k bị lỗi nhưng thao tác strcpy bị lỗi.
Mình k hiểu…

Bài liên quan
0