编辑代码

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

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

	//定义链表结构 
	typedef struct linklist{
		int data;
		
		struct linklist *next;
		
	}linklist;
	
	//用尾插法生成带头节点的链表,以链表存储方式存储线性表	
	linklist *initlist(linklist *head){
		
		linklist *p, *last;
		int x;
		head=(linklist *)malloc(sizeof(linklist));
		head->next=NULL;
		last=head;
		
			scanf("%d" , &x);
			while(x!=0){
				p=(linklist *)malloc(sizeof(linklist));//节点的存储空间动态生成
				
				p->data=x;
				p->next=last->next; 
				last->next=p;
				last=p;
				scanf("%d",&x);
				 
			}
			return(head);
	} 
	
	
	//输出单链表元素的值 
	void outputlist(linklist *head){
		linklist *p;
		p=head;
		printf("Begin to dump the LinkList...\n");
		while(p->next!=NULL){
			printf("->%d",p->next->data);
			p=p->next; 
		}
		printf("\nThe LinkList ended!\n");
	}
	
	
	//在线性表中查找值等于e的元素 ,找到则返回其在线性表中的位置,否者返回
	int locatelist(linklist *head,int e){
		int i=0;
		linklist *p;
		p=head;
		while(p!=NULL){
			p=p->next;
			i=i+1;
			if(p->data==e)
			return i;
		}
		
		return 0;
	}
	
	
	//head为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回
	 linklist *GetElem_L(linklist *head,int i){
	 	
	 	linklist *p;int j=0;
	 	p=head;
	 	
	 	while(p && j<i){
	 		
	 		p=p->next;++j;
	 		
		 }
		 
		 if(!p || j>i )
		 
		 	return NULL;
		 
		 else 
		 	return p;
	 	
	 } 
	 
	 //在带头结点的单链表中第i个位置之前插入元素e
	 void ListInsert_L(linklist *head,int i,int e){
	 	linklist *p,*s;
	 	p=GetElem_L(head,i-1);//p指针指向第i个元素的前一个元素
		 
		 s=(linklist *)malloc(sizeof(linklist));
		 s->data=e;
		 s->next=p->next;
		 p->next=s;
	 } 
	 
	 
	 //在带头结点的单链线性表中,删除第i个元素,并由e返回其值
	 void ListDelete_L(linklist *head,int i,int *e){
	 	linklist *p,*q;
	 	p=GetElem_L(head,i-1);
	 	q=p->next;
	 	p->next=q->next;
	 	*e=q->data;
	 	free(q);
	 } 
	


int main() {

	
	linklist *head;
	printf("请输入线性表元素的值,以0结束:\n");
	head = initlist(head);
	outputlist(head);
	printf("请输入要查找的值:\n");
	int e,i;
	scanf("%d",&e);
	i=locatelist(head,e);
	if(i)
		printf("%d在线性表中的位序是:%d\n",e,i);
	else
		printf("线性表中不存在元素%d\n",e);
		
	//在单链线性表中第i个元素之前插入元素 e
	printf("请输入要插入的位置和元素:");
	scanf("%d%d",&i,&e);
	ListInsert_L(head,i,e);
	outputlist(head);
	//在带头结点的单链线性表中,删除第i个元素,并由e放回其值
	printf("请输入要删除的第i个位置:");
	scanf("%d",&i);
	ListDelete_L(head,i,&e);
	printf("被删除的元素是:%d\n",e);
	outputlist(head);
	
	return 0; 
	
	

	

	
	
}