不帶頭結點的鏈表

#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(grade)
typedef struct Grade{
	int num;
	float score;
	struct Grade *next;
}grade;

grade *create(){//創建動態鏈表 
	int n=0;//鏈表有幾個元素
	grade *head=NULL,*p1=NULL,*p2=NULL;
	do{
		p1=(grade *)malloc(LEN);
		scanf("%d%f",&p1->num,&p1->score);
		if(p1->num==0){
			if(!head){
				return head;
			} 
			else
			{
				p2->next=NULL;
				return head;	
			}
		}
		n++;
		if(n==1){
			head=p2=p1;
		} 
		else{
			p2->next=p1;
			p2=p1;
		}
	}while(1);
}

void print(grade *head){//打印鏈表全部內容 
	grade *p=head;
		while(p!=NULL){
			printf("%-5d%-5.2f\n",p->num,p->score);
			p=p->next;
		}
}

grade *del(grade *head){//刪除指定位置的節點 
	printf("請輸入要刪除節點的位置:");
	grade *p=head,*p1;
	int n,i,j;
	scanf("%d",&n);
	if(n==0);
	else if(n==1)
		head=head->next;
	else{
		i=n;
		while(i-1){
			p1=p;
			p=p->next;
			i--;
		}
		p1->next=p->next;
	}
	return head;
} 

grade *insert(grade *head){//向指定位置插入節點  
	grade *p=head,*temp,*q=malloc(LEN);
	int n,i;
	printf("請輸入要插入節點的位置(插入尾部請輸入0):");
	scanf("%d",&n);
	printf("請輸入要插入節點的信息:");
	q->next=NULL;
	scanf("%d%f",&(q->num),&(q->score));
	if(n==0){
		while(p->next!=NULL)
			p=p->next;
		p->next=q;
	} 
	else if(n==1){
		temp=head;
		head=q;
		head->next=temp;
	}else{
		i=n;
		while(i-1){
			temp=p;
			p=p->next;
			i--;
		}
		temp->next=q;
		q->next=p;
	}
	return head;
}
int main(){
	grade *head=create();
	print(head);
	head=del(head); 
	print(head);
	head=insert(head);
	print(head);
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章