考研数据结构第二章线性表单链表定义操作及代码实现

150 阅读3分钟

考研数据结构第二章线性表单链表定义操作及代码实现

1.初始化操作(初始化带头结点的单链表,构造一个空的单链表,初始化next指针 )

//1.初始化操作(初始化带头结点的单链表,构造一个空的单链表,初始化next指针 )
#define OK 1
#define ERROR 0
int InitLinkList(LinkList &L){
	L = (LinkList)malloc(sizeof(LNode));
	if(L!=NULL){
		L->next = NULL;
		return OK;
	}
	else{
		return ERROR;
	} 
} 

2.采用头插法建立单链表(特点:每次在头节点后插入新结点)

//2.采用头插法建立单链表(特点:每次在头节点后插入新结点)
LinkList CreatList1(LinkList &L){
	LNode *node;
	int x;
	if(!L)
		InitLinkList(L);
	scanf("%d",&x);
	while(x!=9999){
		node = (LNode *)malloc(sizeof(LNode));
		node->data = x;
		node->next = L->next;
		L->next = node;
		scanf("%d",&x);
	}
	return L;
}

3.采用尾插法建立单链表(特点:每次在尾结点后插入新结点)

//3.采用尾插法建立单链表(特点:每次在尾结点后插入新结点)
LinkList CreatList2(LinkList &L){
	LNode *node;int x;LNode *r = L;
	if(!L)
		InitLinkList(L);
	scanf("%d",&x);
	while(x!=9999){
		node = (LNode *)malloc(sizeof(LNode));
		node->data= x;
		r->next = node;
		scanf("%d",&x);
	}
	r->next = NULL;
	return L;
} 

4.按序号查找结点值

//4.按序号查找结点值
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;
}

5.按值查找结点值

//5.按值查找结点值
LNode *LocateElem(LinkList L,ElemType e){
	LNode *p=L->next;
	while(p&&p->data!=e){
		p=p->next;
	}
	return p;
}

6.插入节点操作

//求链表长度
int LinkLen(LinkList L,int i=0){
	LinkList *Node;
	while(L->next!=NULL){
		i++;
		L=L->next;
	}
	return i;
	
} 
LinkList InsertElem(LinkList &L,int i){
	int length;
	length=LinkLen(L);
	if(i>0&&i<=length){	
		LNode *node;
		int x;
		scanf("%d",&x);
		node->data=x;
		LNode *p = L->next;
		for(int j=1;j<i;j++){
			p=p->next;
		}
		node->next=p->next;
		p->next=node;
	} 
	return L;
} 

7.删除结点操作

//7.删除结点操作
LinkList DeletElem(LinkList &L,int i){
	int length;
	length=LinkLen(L);
	if(i>0&&i<=length){
		LNode *p,*q;
		p=GetElem(L,i-1);
		q=p->next;
		p->next=q->next;
		free(q);
	}
} 

完整代码

#include<iostream>
#include<stdlib.h>
using namespace std;
typedef int ElemType; 
typedef struct LNode{
	ElemType data;
	struct LNode *next; 
}LNode,*LinkList;

//1.初始化操作(初始化带头结点的单链表,构造一个空的单链表,初始化next指针 )
#define OK 1
#define ERROR 0
int InitLinkList(LinkList &L){
	L = (LinkList)malloc(sizeof(LNode));
	if(L!=NULL){
		L->next = NULL;
		return OK;
	}
	else{
		return ERROR;
	} 
} 
//2.采用头插法建立单链表(特点:每次在头节点后插入新结点)
LinkList CreatList1(LinkList &L){
	LNode *node;
	int x;
	if(!L)
		InitLinkList(L);
	scanf("%d",&x);
	while(x!=9999){
		node = (LNode *)malloc(sizeof(LNode));
		node->data = x;
		node->next = L->next;
		L->next = node;
		scanf("%d",&x);
	}
	return L;
}

//3.采用尾插法建立单链表(特点:每次在尾结点后插入新结点)
LinkList CreatList2(LinkList &L){
	LNode *node;int x;LNode *r = L;
	if(!L)
		InitLinkList(L);
	scanf("%d",&x);
	while(x!=9999){
		node = (LNode *)malloc(sizeof(LNode));
		node->data= x;
		r->next = node;
		scanf("%d",&x);
	}
	r->next = NULL;
	return L;
} 

//4.按序号查找结点值
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;
}
 
//5.按值查找结点值
LNode *LocateElem(LinkList L,ElemType e){
	LNode *p=L->next;
	while(p&&p->data!=e){
		p=p->next;
	}
	return p;
}

//6.插入节点操作
//求链表长度
int LinkLen(LinkList L,int i=0){
	LinkList *Node;
	while(L->next!=NULL){
		i++;
		L=L->next;
	}
	return i;
	
} 
LinkList InsertElem(LinkList &L,int i){
	int length;
	length=LinkLen(L);
	if(i>0&&i<=length){	
		LNode *node;
		int x;
		scanf("%d",&x);
		node->data=x;
		LNode *p = L->next;
		for(int j=1;j<i;j++){
			p=p->next;
		}
		node->next=p->next;
		p->next=node;
	} 
	return L;
} 
 
//7.删除结点操作
LinkList DeletElem(LinkList &L,int i){
	int length;
	length=LinkLen(L);
	if(i>0&&i<=length){
		LNode *p,*q;
		p=GetElem(L,i-1);
		q=p->next;
		p->next=q->next;
		free(q);
	}
} 
 
  
 
int main(){
	return 0;
}