头歌 单链表的基本操作

第1关 单链表的插入操作

#include 
#include 
#include 
using namespace std;

/* 定义ElemType为int类型 */
typedef int ElemType;
void input(ElemType &s);
void output(ElemType s);
int equals(ElemType a,ElemType b);
/* 单链表类型定义 */
typedef struct LNnode
{	
	ElemType data;
	struct LNnode *next;
}LNnode,*LinkList;

void InitList(LinkList &L);
int ListInsert(LinkList &L,int i,int e) ;
void ListTraverse(LinkList L,void(*vi)(ElemType));

int main()               //main() function 
{	
     LinkList A;
     ElemType e;
     InitList(A);
      int n,i;
     // cout<<"Please input the list number ";
     cin>>n;
     for(i=1;i<=n;i++)
        { 
		   cin>>e;
         ListInsert(A, i, e);
       }
	//cout<<"请输入插入的位置:"<>i;
	//cout<<"请输入插入的值:"<>s;
}
void output(ElemType s)
 {
cout<next = nullptr;
	/********** End **********/
}
int ListInsert(LinkList &L,int i,int e) 
{
	// 在带头结点的单链线性表L的第i个元素之前插入元素e  
	/********** Begin **********/ 
    if(!L) return 0;

    LinkList p = L;
    for(int j = 1;jnext;
    }
    if(!p) return 0;
    LinkList a = (LinkList ) malloc(sizeof(LNnode));
    if(!a) return 0;
    a->data = e;
    a->next = p->next;
    p->next = a;
    return 1;
	/********** End **********/
}

void ListTraverse(LinkList L,void(*vi)(ElemType))
{ 
	// 初始条件:单链表L已存在。
	//操作结果:依次对L的每个数据元素调用函数vi()
	/********** Begin **********/ 
    LinkList p = L;
    while(p->next != nullptr){
        vi(p->next->data);
        p=p->next;
    }   
	/********** End **********/
}

 第2关 单链表的删除操作

#include 
#include 
#include 
using namespace std;

/* 定义ElemType为int类型 */
typedef int ElemType;
void input(ElemType &s);
void output(ElemType s);
int equals(ElemType a,ElemType b);

/* 单链表类型定义 */
typedef struct LNnode
{	
	ElemType data;
	struct LNnode *next;
}LNnode,*LinkList;

void InitList(LinkList &L);
int ListInsert(LinkList &L,int i,int e) ;
int ListDelete(LinkList L,int i,ElemType &e);
void ListTraverse(LinkList L,void(*vi)(ElemType));

int main()               //main() function 
{	
	LinkList A;
	ElemType e;
	InitList(A);
	int n,i;
	// cout<<"Please input the list number ";
	cin>>n;
	for(i=1;i<=n;i++)
	{ 
		cin>>e;
		ListInsert(A, i, e);
	}
	//cout<<"请输入删除的位置:"<>i;	
	if(  ListDelete(A,i,e) )
	{
		cout<<"删除成功,删除后单链表如下:"<>s;
}
void output(ElemType s)
{
	cout<next=NULL; // 指针域为空
	
}

int ListInsert(LinkList &L,int i,ElemType e) 
{	// 在带头结点的单链线性表L的第i个元素之前插入元素e  
	LinkList p,s;
	p = L;   
	int j = 0;
	while (p && j < i-1) {  // 寻找第i-1个结点
		p = p->next;
		++j;
	} 
	if (!p || j > i-1) 
		return 0;                   // i小于1或者大于表长
	s = (LinkList)malloc(sizeof(LNnode));  // 生成新结点
	s->data = e;  s->next = p->next;      // 插入L中
	p->next = s;
	return 1;
}

void ListTraverse(LinkList L,void(*vi)(ElemType))
{ 	// 调用函数vi()依次输出单链表L的每个数据元素
	LinkList p=L->next;
	while(p)
	{
		vi(p->data);
		p=p->next;
	}
	printf("\n");	
}

int  ListDelete(LinkList L,int i,ElemType &e) // 算法2.10。不改变L
{ 
	// 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
	/********** Begin **********/ 
    if(!L->next) return 0;

    LinkList up = L ;
    LinkList p = up->next;
    if(i==1){
        e  = L->next->data;
        LinkList t = L->next;
        L->next = L->next->next;
        free(t);
        return e;
    }
    for(int j = 1;jnext;
        up = up->next;
    }
    if(!p) return 0 ;
    LinkList t = p;
    up->next = p->next;
    e = t->data;
    free(t);
    return e;
	/********** End **********/
}

 第3关 单链表的按照序号查找值操作

#include 
#include 
#include 
using namespace std;

/* 定义ElemType为int类型 */
typedef int ElemType;
void input(ElemType &s);
void output(ElemType s);
int equals(ElemType a,ElemType b);

/* 单链表类型定义 */
typedef struct LNnode
{	
	ElemType data;
	struct LNnode *next;
}LNnode,*LinkList;

void InitList(LinkList &L);
int ListInsert(LinkList &L,int i,int e) ;
void ListTraverse(LinkList L,void(*vi)(ElemType));
int GetElem(LinkList L,int i,ElemType &e) ;

int main()               //main() function 
{	
	LinkList A;
	ElemType e;
	InitList(A);
	int n,i;
	// cout<<"Please input the list number ";
	cin>>n;
	for(i=1;i<=n;i++)
	{ 
		cin>>e;
		ListInsert(A, i, e);
	}
	//cout<<"请输入查找的序号:"<>i;	
	if(  GetElem(A,i,e) )
	{
		cout<<"查找成功!"<>s;
}
void output(ElemType s)
{
	cout<next=NULL; // 指针域为空
	
}

int ListInsert(LinkList &L,int i,ElemType e) 
{	// 在带头结点的单链线性表L的第i个元素之前插入元素e  
	LinkList p,s;
	p = L;   
	int j = 0;
	while (p && j < i-1) {  // 寻找第i-1个结点
		p = p->next;
		++j;
	} 
	if (!p || j > i-1) 
		return 0;                   // i小于1或者大于表长
	s = (LinkList)malloc(sizeof(LNnode));  // 生成新结点
	s->data = e;  s->next = p->next;      // 插入L中
	p->next = s;
	return 1;
}

void ListTraverse(LinkList L,void(*vi)(ElemType))
{ 	// 初始条件:单链表L已存在。
	//操作结果:依次对L的每个数据元素调用函数vi()
	LinkList p=L->next;
	while(p)
	{
		vi(p->data);
		p=p->next;
	}
	printf("\n");
}

int GetElem(LinkList L,int i,ElemType &e) 
{ 
	// L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回1,否则返回0
	/********** Begin **********/ 
	if(!L->next) return 0;
    LinkList p = L;
    for(int j =0;jnext;
    }
    if(!p) return 0;
    e = p->data;
    return e;
    
	/********** End **********/
}

 第4关 单链表的按照值查找结点位序的操作

#include 
#include 
#include 
using namespace std;


/* 定义ElemType为int类型 */
typedef int ElemType;
void input(ElemType &s);
void output(ElemType s);
int equals(ElemType a,ElemType b);

/* 单链表类型定义 */
typedef struct LNnode
{	
	ElemType data;
	struct LNnode *next;
}LNnode,*LinkList;
void InitList(LinkList &L);
int ListInsert(LinkList &L,int i,int e) ;
void ListTraverse(LinkList L,void(*vi)(ElemType));
int LocateElem(LinkList L,ElemType e,int(*compare)(ElemType,ElemType));
int main()               //main() function 
{	
	LinkList A;
	ElemType e;
	InitList(A);
	int n,i;
	// cout<<"Please input the list number ";
	cin>>n;
	for(i=1;i<=n;i++)
	{ 
		cin>>e;
		ListInsert(A, i, e);
	}
	//cout<<"请输入查找的元素:"<>e;	
	i=LocateElem(A,e,equals);
	if( i ) 
	{
		cout<<"查找成功!"<>s;
}
void output(ElemType s)
{
	cout<next=NULL; // 指针域为空	
}

int ListInsert(LinkList &L,int i,ElemType e) 
{	// 在带头结点的单链线性表L的第i个元素之前插入元素e  
	LinkList p,s;
	p = L;   
	int j = 0;
	while (p && j < i-1) {  // 寻找第i-1个结点
		p = p->next;
		++j;
	} 
	if (!p || j > i-1) 
		return 0;                   // i小于1或者大于表长
	s = (LinkList)malloc(sizeof(LNnode));  // 生成新结点
	s->data = e; 
    s->next = p->next;      // 插入L中
	p->next = s;
	return 1;	
}

void ListTraverse(LinkList L,void(*vi)(ElemType))
{ 	// 初始条件:单链表L已存在。
	//操作结果:依次对L的每个数据元素调用函数vi()
	LinkList p=L->next;
	while(p)
	{
		vi(p->data);
		p=p->next;
	}
	printf("\n");
}

int LocateElem(LinkList L,ElemType e,int (*equal)(ElemType,ElemType))
{ 
	// 初始条件: 单链表L已存在,equal()是数据元素判定函数(满足为1,否则为0)
	// 操作结果: 返回L中第1个与e满足关系equal()的数据元素的位序,若这样的数据元素不存在,则返回值为0
	/********** Begin **********/ 
	if(!L->next) return 0;
    LinkList p = L->next;
    for(int i = 1;p;i++){
        if(equal(p->data,e))
            return i;
        p = p->next;
    }
	/********** End **********/
}

第5关 单链表的逆置操作

#include 
#include 
#include 
using namespace std;

/* 定义ElemType为int类型 */
typedef int ElemType;
void input(ElemType &s);
void output(ElemType s);
int equals(ElemType a,ElemType b);

/* 单链表类型定义 */
typedef struct LNnode
{	
	ElemType data;
	struct LNnode *next;
}LNnode,*LinkList;
void InitList(LinkList &L);
int ListInsert(LinkList &L,int i,int e) ;
void ListTraverse(LinkList L,void(*vi)(ElemType));
void reverse (LinkList  L);
int main()               //main() function 
{	
	LinkList A;
	ElemType e;
	InitList(A);
	int n,i;
	// cout<<"Please input the list number ";
	cin>>n;
	for(i=1;i<=n;i++)
	{ 
		cin>>e;
		ListInsert(A, i, e);
	}
	cout<<"逆置单链表:"<>s;
}
void output(ElemType s)
{
	cout<next=NULL; // 指针域为空	
}

int ListInsert(LinkList &L,int i,ElemType e) 
{	// 在带头结点的单链线性表L的第i个元素之前插入元素e  
	LinkList p,s;
	p = L;   
	int j = 0;
	while (p && j < i-1) {  // 寻找第i-1个结点
		p = p->next;
		++j;
	} 
	if (!p || j > i-1) 
		return 0;                   // i小于1或者大于表长
	s = (LinkList)malloc(sizeof(LNnode));  // 生成新结点
	s->data = e;  s->next = p->next;      // 插入L中
	p->next = s;
	return 1;	
}

void ListTraverse(LinkList L,void(*vi)(ElemType))
{ 	// 初始条件:单链表L已存在。
	//操作结果:依次对L的每个数据元素调用函数vi()
	LinkList p=L->next;
	while(p)
	{
		vi(p->data);
		p=p->next;
	}
	printf("\n");	
}

void reverse (LinkList  L)
{  
	//逆置L指针所指向的单链表
	/********** Begin **********/ 
    LinkList l = L->next;
    LinkList end = l->next;
    LinkList t;
    while(end){
        t = L->next;
        L->next = l->next;
        l->next = end->next;
        end->next = t;
        end = l->next;
    }


    
	/********** End **********/
}

 第6关 两个有序单链表的合并操作

#include 
#include 
#include 

using namespace std;

/* 定义ElemType为int类型 */
typedef int ElemType;

void input(ElemType &s);

void output(ElemType s);

int equals(ElemType a, ElemType b);

/* 单链表类型定义 */
typedef struct LNnode {
    ElemType data;
    struct LNnode *next;
} LNnode, *LinkList;

void InitList(LinkList &L);

int ListInsert(LinkList &L, int i, int e);

void ListTraverse(LinkList L, void(*vi)(ElemType));

void MergeList(LinkList &La, LinkList &Lb, LinkList &Lc);

int main()               //main() function
{
    LinkList A, B, C;
    ElemType e;
    InitList(A);
    InitList(B);
    int n, i;
    // cout<<"Please input the list number ";
    cin >> n;
    for (i = 1; i <= n; i++) {
        cin >> e;
        ListInsert(A, i, e);
    }
    cin >> n;
    for (i = 1; i <= n; i++) {
        cin >> e;
        ListInsert(B, i, e);
    }
    cout << "合并两个有序单链表:" << endl;
    MergeList(A, B, C);
    
    ListTraverse(C, output);
}

/*****ElemType类型元素的基本操作*****/
void input(ElemType &s) {
    cin >> s;
}

void output(ElemType s) {
    cout << s << " ";
}

int equals(ElemType a, ElemType b) {
    if (a == b)
        return 1;
    else
        return 0;
}

/*****单链表的基本操作*****/
void InitList(LinkList &L) {    // 操作结果:构造一个空的单链表L
    L = (LinkList) malloc(sizeof(LNnode)); // 产生头结点,并使L指向此头结点
    if (!L) // 存储分配失败
        return;
    L->next = NULL; // 指针域为空
}

int ListInsert(LinkList &L, int i, ElemType e) {    // 在带头结点的单链线性表L的第i个元素之前插入元素e
    LinkList p, s;
    p = L;
    int j = 0;
    while (p && j < i - 1) {  // 寻找第i-1个结点
        p = p->next;
        ++j;
    }
    if (!p || j > i - 1)
        return 0;                   // i小于1或者大于表长
    s = (LinkList) malloc(sizeof(LNnode));  // 生成新结点
    s->data = e;
    s->next = p->next;      // 插入L中
    p->next = s;
    return 1;
}

void ListTraverse(LinkList L, void(*vi)(ElemType)) {    // 初始条件:单链表L已存在。
    //操作结果:依次对L的每个数据元素调用函数vi()
    LinkList p = L->next;
    while (p) {
        vi(p->data);
        p = p->next;
    }
    printf("\n");
}

void MergeList(LinkList &La, LinkList &Lb, LinkList &Lc) {    // LC 只是指正 没有指向任何地址
    // 已知单链线性表La和Lb的元素按值非递减排列。
    // 归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列。
    /********** Begin **********/

    LinkList a = La->next, b = Lb->next, c = La;
    Lc = c;

    while (a && b) {
        LinkList t= (LinkList) malloc(sizeof(LNnode));
        if (!t) return;
        t->next = nullptr;

        if (a->data < b->data) {
            t->data = a->data;
            c->next = t;
            c = c->next;
            a = a->next;
        }else {
            t->data = b->data;
            c->next = t;
            c = c->next;
            b = b->next;
        }
    }

    while (a) {
        LinkList t= (LinkList) malloc(sizeof(LNnode));
        if (!t) return;
        t->next = nullptr;

        t->data = a->data;
        c->next = t;
        c = c->next;
        a = a->next;
    }
    while (b) {
        LinkList t= (LinkList) malloc(sizeof(LNnode));
        if (!t) return;
        t->next = nullptr;
        t->data = b->data;
        c->next = t;
        c = c->next;
        b = b->next;
    }

    /********** End **********/
}

你可能感兴趣的:(数据结构,c++,算法,数据结构)