欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

不带头结点的链表

程序员文章站 2022-03-15 17:34:26
...
#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;
}