01/10/2018, 00:48

Ký hiệu -> trong C để làm gì?

Mình đang học đến phần danh sách liên kết đơn, thì thấy cái ký hiệu -> liệu nó có tương ứng với dấu . ko? kiểu như lấy 1 thuộc tính của một đối tượng đó ?
cho mình hỏi thêm làm thế nào để in ra các phần tử trong danh sách liên kết đơn vậy ?
#include <stdio.h>

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

typedef struct node *listnode;

void Insert_Begin(listnode *p, int x){
	listnode q;
	q = (listnode)malloc(sizeof(struct node));
	q->item=x;
	q->next=*p;
	*p=q;
}

void Insert_End(listnode *p, int x){
	listnode q,r;
	q = (listnode)malloc(sizeof(struct node));
	q->item = x;
	q->next = NULL;
	if(*p==NULL) *p=q;
	else{
		r = *p;
		while (r->next != NULL) {
			r=r->next;
		}
		r->next=q;
	}
}

void Insert_Middle(listnode *p,int position, int x){
	int count = 1, found=0;
	listnode q,r;
	r=*p;
	while((r!=NULL)&& (found==0)){
		if(count == position){
			q=(listnode)malloc(sizeof(struct node));
			q->item=x;
			q->next=r->next;
			r->next=q;
			found=1;
		}
		count++;
		r=r->next;
	}
	if(found==0)
		printf("Khong tim thay vi tri can chen.");
}

void Remove_Begin(listnode *p){
	listnode q;
	if(*p==NULL) return;
	q=*p;
	*p=(*p)->next;
	q->next=NULL;
	free(q);
}

void Remove_End(listnode *p){
	listnode q,r;
	if(*p==NULL) return;
	if((*p)->next == NULL){
		Remove_Begin(*p);
		return;
	}
	r=*p;
	while(r->next==NULL){
		q=r;
		r=r->next;
	}
	q->next=NULL;
	free(r);
}

void Remove_Middle(listnode *p,int position){
	int count =1,found=0;
	listnode q,r;
	r=*p;
	while ((r !=NULL)&&(found==0)){
		if(count == position){
			q = r->next;
			r->next=q->next;
			q->next=NULL;
			free(q);
			found=1;
		}
		count++;
		r=r->next;
	}
	if(found==0){
		printf("Khong tim thay vi tri can xoa.");
	}
}
int main(){
	printf("Tao ra mot danh sach:");
	listnode p;
	p=NULL;
	Insert_Begin(&p,4);
	listnode r;
	r=p;
	while(r->next != NULL){
		printf("%d",*(r.item));
		r=r->next;
	}
}
Nguyễn Văn Nam viết 03:02 ngày 01/10/2018

Nó có tương đương nhé. Nhưng chỉ dùng cho pointer thôi nhé. Em nên học kỹ hơn về phần pointer nhé. C/C++ nó quan trọng lắm đấy

Hidan viết 03:02 ngày 01/10/2018

e đọc sách phần pointer ko có nói đến a à, nó tương đương vậy mh có thể thay thế dc ko với cho e hỏi sao e in ra các phần tử trong danh sách lkd lại ko dc ?

Nguyễn Văn Nam viết 02:57 ngày 01/10/2018

Code này anh chạy thử thấy sai sai. Không biết em có chạy được không chứ anh build là bị lỗi rồi @@!
Cái này anh thử sửa lại 1 chút. Chủ yếu ở hàm main. Còn về việc thay thế -> thì không thay được nhé.

#include<stdio.h>
#include<stdlib.h>
struct node {
	int item;
	struct node *next;
};

typedef struct node *listnode;

void Insert_Begin(listnode *p, int x){
	listnode q;
	q = (listnode)malloc(sizeof(struct node));
	q->item=x;
	q->next=*p;
	*p=q;
}

void Insert_End(listnode *p, int x){
	listnode q,r;
	q = (listnode)malloc(sizeof(struct node));
	q->item = x;
	q->next = NULL;
	if(*p==NULL) *p=q;
	else{
		r = *p;
		while (r->next != NULL) {
			r=r->next;
		}
		r->next=q;
	}
}

void Insert_Middle(listnode *p,int position, int x){
	int count = 1, found=0;
	listnode q,r;
	r=*p;
	while((r!=NULL)&& (found==0)){
		if(count == position){
			q=(listnode)malloc(sizeof(struct node));
			q->item=x;
			q->next=r->next;
			r->next=q;
			found=1;
		}
		count++;
		r=r->next;
	}
	if(found==0)
		printf("Khong tim thay vi tri can chen.");
}

void Remove_Begin(listnode *p){
	listnode q;
	if(*p==NULL) return;
	q=*p;
	*p=(*p)->next;
	q->next=NULL;
	free(q);
}

void Remove_End(listnode *p){
	listnode q,r;
	if(*p==NULL) return;
	if((*p)->next == NULL){
		Remove_Begin(p);
		return;
	}
	r=*p;
	while(r->next==NULL){
		q=r;
		r=r->next;
	}
	q->next=NULL;
	free(r);
}

void Remove_Middle(listnode *p,int position){
	int count =1,found=0;
	listnode q,r;
	r=*p;
	while ((r !=NULL)&&(found==0)){
		if(count == position){
			q = r->next;
			r->next=q->next;
			q->next=NULL;
			free(q);
			found=1;
		}
		count++;
		r=r->next;
	}
	if(found==0){
		printf("Khong tim thay vi tri can xoa.");
	}
}


int main(){
	printf("Tao ra mot danh sach:");
	listnode p;
	p=NULL;
	Insert_Begin(&p,4);
	Insert_Begin(&p,5);
	Insert_Begin(&p,6);
	listnode r;
	r=p;
	while(r != NULL){
		printf("%d",(r->item));
		r=r->next;
	}
}
Hidan viết 02:51 ngày 01/10/2018

ngon nhưng sao nó in thiếu 1 phần tử vậy a ?, e sửa thành do while vẫn thiếu ?

Nguyễn Văn Nam viết 03:03 ngày 01/10/2018

Đủ cả mà nhỉ @@!

Hidan viết 03:04 ngày 01/10/2018

sao e bi thieu nhi po tay @@

Nguyễn Văn Nam viết 03:03 ngày 01/10/2018

Thấy code của anh không? Dòng 107 ý (Xem ảnh ý) =))~ thì biết tại sao ngay.

Hidan viết 03:00 ngày 01/10/2018

à cái cuối cùng nó trỏ tới null

Từ Gia Lộc viết 03:02 ngày 01/10/2018

Bạn có thể thay thế
Ví dụ
r ->pNext; <=> (*r).pNext;

Hidan viết 02:53 ngày 01/10/2018

b đọc ở đâu vậy có thể chia sẻ cho t vs dc ko? t muốn đọc thêm

Từ Gia Lộc viết 03:00 ngày 01/10/2018

Cái này là kiến thức căn bản về pointer thôi mà Bạn ^^
Bạn có thể tìm đọc quyển Kỹ Thuật Lập Trình của Đại học KHTN về phần pointer này nói khá kỹ và chi tiết.

Hidan viết 02:58 ngày 01/10/2018

uk thì mh mất căn bản, b có thể cho t link tải online ko t tìm thấy mỗi kỹ thuật lập trình dhkhtn hcm nhưng ko nói đến phần này

Từ Gia Lộc viết 02:57 ngày 01/10/2018

Này chỉ có sách thôi, không có bản online đâu Bạn ^^

Đặng Trung viết 02:59 ngày 01/10/2018

mình ko nhớ rõ lắm chức năng thì ko khác lắm còn về cách sử dụng thì trong 1 số trường hợp thì dung . ko đc mà phải dùng -> . Cụ thể th như thế nào thì mình ko nhớ đc ^^!

anh viết 02:59 ngày 01/10/2018

nó kiểu trỏ tới, giống như bạn vẽ ra giấy dslk sẽ dễ hiểu hơn… kiểu như vậy

Bài liên quan
0