单链表上的基本操作
单链表的定义
单链表中结点类型的描述如下:
 | typedef struct LNode{			     ElemType data;				     struct LNode *next;		 }LNode,*LinkList;
 
  | 
单链表上基本操作的实现
1.采用头插法建立单链表
 | LinkList List_HeadInsert(LinkList &L){				     LNode *s;     int x;     L=(LinkList)malloc(sizeof(LNode));				     L->next = NULL;									     scanf("%d",&x);									     while(x!=9999){									         s = (LNode*)malloc(sizeof(LNode));			         s->data = x;         s->next = L->next;         L->next = s;								         scanf("%d",&x);     }     return L; }			
 
  | 
2.采用尾插法建立单链表
 | LinkList List_TailInsert(LinkList &L){				     int x;											     L=(LinkList)malloc(sizeof(LNode));				     LNode *s,*r=L;									     scanf("%d",&x);     while(x!=9999){         s = (LNode*)malloc(sizeof(LNode));         s->data=x;         r->next = s;         r = s;										         scanf("%d",&x);              }     r->next = NULL;     return L; }
 
  | 
3.按序号查找结点值
 | LNode *GetElem(LinkList L,int i){     int j=1;							     LNode *p = L->next;					     if(i==0)         return L;						     if(i<1)         return NULL;					     while(p&&j<i)						     {         p=p->next;         j++;     }     return p;							 }
 
  | 
4.按值查找表结点
 | LNode *LocateElem(LinkList L,ElemType e){     LNode *p = L->next;     while(p!=NULL&&p->data!=e)			     {         p=p->next;     }     return p;							 }
 
  | 
5.插入结点操作
 |  void Insert(LinkList &L,int i,int x){ 	LNode *p; 	LNode *s=(LNode*)malloc(sizeof(LNode));				 	s->data=x; 	s->next=NULL;  	p=GetElem(L,i-1); 	if(p!=NULL){ 		s->next =p->next; 		p->next=s; 	}else{ 		cout<<"插入值非法"<<endl; 		return ;  	} 	 }
 
  | 
对某一结点进行前插操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
   |  void Delect(LinkList &L,int i){ 	 	LNode *p; 	LNode *q=(LNode*)malloc(sizeof(LNode));			    	p=GetElem(L,i-1);				     	if(p==NULL||p->next==NULL)           	{								     		cout<<"删除值非法"<<endl; 		free(q); 		return ; 	} 	q=p->next;					 	p->next=q->next;			 	free(q); 								 }	
 
  | 
6.删除结点操作
 |  p=GetElem(L,i-1)			 q=p->next;					 p->next=q->next;			 free(q);					
 
  | 
拓展:删除结点*p
 | q=p->next;					 p->data = p->next->data		 p->next = q->next;			 free(q);					
 
  | 
单链表上基本操作的完整实现
程序源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
   | #include<bits/stdc++.h> using namespace std; typedef int ElemType; typedef struct LNode{			     ElemType data;				     struct LNode *next;		 }LNode,*LinkList; LinkList List_HeadInsert(LinkList &L){				     LNode *s;     int x;     L=(LinkList)malloc(sizeof(LNode));				     L->next = NULL;									     scanf("%d",&x);									     while(x!=9999){									         s = (LNode*)malloc(sizeof(LNode));			         s->data = x;         s->next = L->next;         L->next = s;								         scanf("%d",&x);     }     return L; } LNode *GetElem(LinkList L,int i){     int j=1;							     LNode *p = L->next;					     if(i==0)         return L;						     if(i<1)         return NULL;					     while(p&&j<i)						     {         p=p->next;         j++;     }     return p;							 }	 LNode *LocateElem(LinkList L,ElemType e){     LNode *p = L->next;     while(p!=NULL&&p->data!=e)			     {         p=p->next;     }     return p;							 } void PrintLinkList(LinkList L){         	LNode *tmp = L->next; 	if(tmp==NULL) 	{ 		cout<<"链表为空"<<endl; 		return ;  	} 	while(tmp!=NULL){ 		cout<<tmp->data<<" "; 		tmp=tmp->next; 	} 	cout<<endl;  }	 void Insert(LinkList &L,int i,int x){ 	LNode *p; 	LNode *s=(LNode*)malloc(sizeof(LNode));				 	s->data=x; 	s->next=NULL;  	p=GetElem(L,i-1); 	if(p!=NULL){ 		s->next =p->next; 		p->next=s; 	}else{ 		cout<<"插入值非法"<<endl; 		return ;  	} 	 }
  void Delect(LinkList &L,int i){ 	 	LNode *p; 	LNode *q=(LNode*)malloc(sizeof(LNode));			    	p=GetElem(L,i-1);				     	if(p==NULL||p->next==NULL)           	{								     		cout<<"删除值非法"<<endl; 		free(q); 		return ; 	} 	q=p->next;					 	p->next=q->next;			 	free(q); 								 }	 int main(){ 	LinkList L;						 	List_HeadInsert(L);				 	PrintLinkList(L);				 	LNode *tmp; 	tmp=GetElem(L,2);				 	if(tmp!=NULL){ 		cout<<"位置为2的元素是:"<<tmp->data<<endl; 	}else{ 		cout<<"非法的位置"<<endl; 	} 	tmp=LocateElem(L,1);			 	if(tmp!=NULL){ 		cout<<"存在值为1的元素:"<<tmp->data<<endl; 	}else{ 		cout<<"没有找到该值"<<endl; 	} 	PrintLinkList(L);				 	Insert(L,5,110);				 	PrintLinkList(L);				 	Delect(L,2);        			 	PrintLinkList(L);				 	return 0; } 
 
  | 
程序输出
 | 4 3 2 1 位置为2的元素是:3 存在值为1的元素:1 4 3 2 1 4 3 2 1 110 4 2 1 110
 
  |