算法与数据结构之单链表

#include<iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
#define NULL 0
#define ERROR 0
#define OK 1	

typedef struct dlb
{
	int data;
	struct dlb *next;
}L,*LinkList;

void CreateList(LinkList &L,int n){                  //创建链表
	//逆位序输入n个元素的值,建立带表头结点的单链表L
	struct dlb *p;
	L=(LinkList) malloc (sizeof (L));
	L->next=NULL;                      //先建立一个带头结点的单链表
	p=L->next;
	//for(int i=0;i<n;i++){
	//	p=(LinkList)malloc(sizeof(L));
	//	cout<<"                              请输入第"<<i+1<<"个元素的值          ";
	//	cin>>p->data;
	//   p->next=L->next;L->next=p;
    //	}
	for(int i=n;i>0;--i){
		p=(LinkList)malloc(sizeof(L));                 //生成新结点
     	cout<<"                              请输入第"<<i<<"个元素的值          ";
    	cin>>p->data;                                     //输入元素值
        p->next=L->next;L->next=p;                        //插入到表头
	}
}


int GetElem(LinkList L1){          //查找元素
	dlb *p1;
	p1=L1->next;int i,j=1,e;                         //初始化,p指向第一个结点,j为计数器
	cout<<"                              请输入要查找的元素序号:      ";
	cin>>i;

	while( p1 && j<i){                              //顺指针向后查找,直到p指向第i个元素或p为空
		p1=p1->next;++j;
	}

	if(!p1 || j>i){                                //第i个元素不存在
		cout<<"                          您要查找的元素不存在!             ";
	}

	e=p1->data;                                  //取第i个元素
	cout<<"                              您要查找的元素为:            "<<e<<endl;
	return 0;
} 

	
                           
int PrintAll(LinkList L1){          //输出所有元素
	dlb *p2;
	p2=L1->next;
	while(p2){
		int a=p2->data;
		cout<<a<<" ";
		p2=p2->next;
	} 
	return 0;  
}        

int ListInsert(LinkList L1){                   //插入元素

	struct dlb *p3,*s;
	p3=L1->next;
	int i,j=0,e;
	cout<<"                               请输入要插入的元素序号:      ";
    cin>>i;
	i--;
	cout<<"                               请输入要插入的元素:          ";
	cin>>e;
	while(p3 && j<i-1) {p3=p3->next; ++j;};            //寻找第i-1个结点
	if(!p3 || j>i-1) return ERROR;                     //i小于1或者大于表长加1
	s=(LinkList)malloc(sizeof(L1));                    //生成新结点
	s->data=e;s->next=p3->next;                        //插入到L中
	p3->next=s; 
    return OK;
}//ListInsert                        

int ListDelete(LinkList L1){                      //删除元素

	struct dlb *p4,*q;
    p4=L1;
	int i,j=0,e;
	cout<<"                               请输入要删除的元素序号:      ";
	cin>>i;
	while(p4->next && j<i-1){              //寻找第i个节点,并令p指向其前驱
		p4=p4->next;++j;
	}
	if(!(p4->next) || j>i-1) return ERROR;           //删除位置不合理
	q=p4->next; p4->next=q->next;                    //删除并释放结点
	e=q->data;
	cout<<"                               您删除的元素为:             "<<e<<endl;
	//free(q);
	return OK;
}//ListDelete                             

int main(){	
	int n=5;

	dlb *L1;

	cout<<"***********************************创建链表:***********************************"<<endl<<"\n";
	CreateList(L1,n);    //创建

	cout<<"\n"<<"********************************您创建的链表为:********************************"<<endl<<"\n";
	PrintAll(L1);       //输出
    
	cout<<"\n"<<"***********************************查找元素:***********************************"<<endl<<"\n";
	GetElem(L1);       //查找

	cout<<"\n"<<"***********************************插入元素:***********************************"<<endl<<"\n";
	ListInsert(L1);    //插入

	cout<<"\n"<<"*****************************修改后的新链表为:******************************"<<endl<<"\n";
	PrintAll(L1);      //输出

	cout<<"\n"<<"***********************************删除链表:***********************************"<<endl<<"\n";
	ListDelete(L1);    //删除

	cout<<"\n"<<"******************************修改后的新链表为:*****************************"<<endl;
	PrintAll(L1);     //输出

	return 0;
}

你可能感兴趣的:(算法与数据结构之单链表)