双链表基本操作

#include <stdlib.h>
#include <iostream>
using namespace std;

#define null 0
#define MAXSIZE 50

struct strlnode
{
	int data;
	struct strlnode *plast;
	struct strlnode *pnext;
};

void create(struct strlnode **p, int x)  /*创建双链表(表头节点)*/
{
	struct strlnode *q;

	q = (struct strlnode *)malloc(sizeof(struct strlnode));
	q->data = x;
	q->plast = null;
	q->pnext = null;

	*p = q;

	return;
}

void insertnode(struct strlnode **p, int i, int x) /* 在链表第i个位置插入数据等于x的节点 */
{
	/* 代码在这里实现 */
	if (p == NULL || *p == NULL )
	{
		cout<<"error!"<<endl;
		return ;
	}
	if (i < 0)
	{
		printf("i must be larger than 0 !");
		return ;
	}
	struct strlnode *pTemp = *p;//指向头结点
	struct strlnode *newNode;

	newNode = (struct strlnode *)malloc(sizeof(struct strlnode));
	newNode->data = x;

	if (0 == i)//插入到头结点
	{

		newNode->pnext = pTemp;
		pTemp->plast = newNode;
		newNode->plast = NULL;
		*p = newNode;
		return;
	}

	int k = i;
	while(k > 1 && pTemp->pnext != NULL)//查找第i个结点
	{
		pTemp = pTemp->pnext;
		k--;
	}

	if (pTemp->pnext == NULL)
	{
		pTemp ->pnext = newNode;
		newNode->plast = pTemp;
		newNode->pnext = NULL;
	}
	else
	{
		newNode->pnext = pTemp->pnext;
		newNode->plast = pTemp;
		pTemp->pnext->plast = newNode;
		pTemp->pnext = newNode;

	}
	return ;

}

void deletenode(struct strlnode **p, int i) /* 删除链表中第i个节点 */
{
	/* 代码在这里实现 */
	if (p == NULL || *p == NULL )
	{
		printf("error!");
		return ;
	}
	if (i < 0)
	{
		printf("i must be larger than 0 !");
		return ;
	}

	if (i == 0 && (*p)->pnext == NULL)//仅有一个结点
	{
		free(*p);
		p = NULL;
		return;
	}
	struct strlnode *pTemp = *p;//指向头结点
	int k = i;
	while(k > 1 && pTemp != NULL)//查找第i-1个结点
	{
		pTemp = pTemp->pnext;
		k--;
	}

	struct strlnode *qTemp;
	qTemp = pTemp ->pnext;
	if (qTemp->pnext != NULL)
	{
		pTemp->pnext = qTemp->pnext;
		qTemp->pnext->plast = pTemp;
		free(qTemp);
	}
	else
	{
		pTemp->pnext = qTemp->pnext;
		free(qTemp);
	}

}

int getnodenum(struct strlnode **p)  /*获取链表中节点个数*/
{
	int nodenum = 0;
	/* 代码在这里实现 */
	if (NULL == p)
	{
		return nodenum;
	}
	struct strlnode *pTemp ;
	pTemp = *p;
	while(pTemp != NULL)
	{
		nodenum++;
		pTemp = pTemp->pnext;
	}

	return nodenum;
}

void bignumberplus(struct strlnode **plus, struct strlnode **p, struct strlnode **q) /* 使用链表实现大整数相加 */
{
	/* 代码在这里实现 */
	if (NULL == p || NULL == *p)
	{
		*plus = *q;
		return;
	}
	if (NULL == q || NULL == *q)
	{
		*plus = *p;
		return;
	}
    struct strlnode *pTemp = *p;
    struct strlnode *qTemp = *q;
    while(NULL != pTemp->pnext)
    {
        pTemp = pTemp->pnext;
    }
    while(NULL != qTemp->pnext)
    {
        qTemp = qTemp->pnext;
    }
	int carry = 0;

	struct strlnode *sum = (struct strlnode *)malloc(sizeof(struct strlnode));

	sum->data = (pTemp->data + qTemp ->data)%10;
	carry = (pTemp->data + qTemp ->data)/10;
	sum->plast = NULL;
	sum->pnext = NULL;
	pTemp = pTemp->plast;
	qTemp = qTemp->plast;

	struct strlnode *temp;
	while(NULL != pTemp && NULL != qTemp)
	{
		temp = (struct strlnode *)malloc(sizeof(struct strlnode));
		temp->data = (pTemp->data + qTemp ->data + carry)%10;
		carry = (pTemp->data + qTemp ->data + carry)/10;

		temp->pnext= sum;
		temp->plast = NULL;
		sum->plast = temp;

		pTemp = pTemp->plast;//链表均向前移动
		qTemp = qTemp->plast;
		sum = sum->plast;
	}
	while(NULL != pTemp)
	{
		temp = new struct strlnode;
		temp->data = (pTemp->data + carry)%10;
		carry = (pTemp->data + carry)/10;

        temp->pnext= sum;
        temp->plast = NULL;
        sum->plast = temp;

		pTemp = pTemp->plast;
		sum = sum->plast;
	}
	while(NULL != qTemp)
	{
		temp = new struct strlnode;
		temp->data = (qTemp ->data + carry)%10;
		carry = (qTemp ->data + carry)/10;

        temp->pnext= sum;
        temp->plast = NULL;
        sum->plast = temp;

		qTemp = qTemp->plast;
		sum = sum->plast;
	}
	while (carry != 0)
	{
		temp = new struct strlnode;
		temp->data = carry%10;
		carry /= 10;

        temp->pnext= sum;
        temp->plast = NULL;

		sum->plast = temp;
        sum = sum->plast;

	}
    *plus = sum;
	return ;

}

void readtolnode(struct strlnode **p, int *a, int size)  /* 将数组写入链表中,链表中的数据的先后顺序和数组中的顺序要保持一致 */
{
	int j = 0;
	int data = 0;
	struct strlnode *s = *p;

	s->data = *(a + (size-1));

	for(j = 2; j < (size+1); j++)
	{
		data = *(a + (size-j));
		insertnode(p, 0, data);
	}

	return;
}

void writetosqlist(int *a, struct strlnode *p)  /* 将链表写入数组中,数组中的数据的先后顺序和链表中的顺序要保持一致 */
{
	int j = 0;
	struct strlnode *s = p;

	while(s != null)
	{
		*(a + j) = s->data;
		s = s->pnext;
		j++;
	}

	return;
}

时间: 2024-08-15 21:23:12

双链表基本操作的相关文章

数据结构学习之双链表基本操作

数据结构学习之双链表基本操作 0x1 前言 今天实验课,学习了下双链表的写法,这里记录下. 0x2 正文 题目要求如下: 本实验的双链链表元素的类型为char,完成如下实验要求: (1)初始化单链表h (2)采用尾插法依次插入a.b.c.d.e (3)输出单链表h (4)输出单链表h的长度 (5)判断单链表h是否为空 (6)输出单链表h的第3个元素 (7)输出元素a的逻辑位置 (8)在第4个元素位置上插入元素f (9)输出单链表h (10)删除单链表h的第3个元素 (11)输出单链表h (12)

C++ 双链表基本操作

上一篇博客主要总结了单向链表,这次再总结一下双向链表. 1.概念 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. 结构图如下所示: 2.基本操作实例 DoubleList.cpp #include "stdafx.h" #include "DoubleList.h" #include <stdio.h>

实例讲解C++ 双链表基本操作

1.概念 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. 结构图如下所示: 2.基本操作实例 DoubleList.cpp #include "stdafx.h" #include "DoubleList.h" #include <stdio.h> #include <malloc.h>

日常学习随笔-数组、单链表、双链表三种形式实现栈结构的基本操作

一.栈结构 栈(stack)是限制插入和删除只能在一个位置上的表,该位置是 表的末端,叫做栈的顶(Top).对栈的基本操作有push(进栈),pop(出栈),peak(栈顶元素),size(栈容量)等. 栈的核心思想:"先进后出". 二.案例一:数组实现"栈" 1 package com.xfwl.algorithmAnalysis.stack; 2 3 import java.util.Arrays; 4 5 /** 6 * 自定义栈结构(基于数组的形式) 7 *

双链表的基本操作

1 #include <stdio.h> 2 #include <stdlib.h> 3 typedef struct line{ 4 struct line * prior; 5 int data; 6 struct line * next; 7 }line; 8 //双链表的创建 9 line* initLine(line * head); 10 //双链表插入元素,add表示插入位置 11 line * insertLine(line * head,int data,int

链表 基本操作

实验目的 1. 定义单链表的结点类型. 2. 熟悉对单链表的一些基本操作和具体的函数定义. 3. 通过单链表的定义掌握线性表的链式存储结构的特点. 4. 掌握循环链表和双链表的定义和构造方法. 实验内容 该程序的功能是实现单链表的定义和操作.该程序包括单链表结构类型以及对单链表操作的具体的函数定义和主函数.程序中的单链表(带头结点)结点为结构类型,结点值为整型. /* 定义DataType为int类型 */ typedef int DataType; /* 单链表的结点类型 */ typedef

C实现头插法和尾插法来构建非循环双链表(不带头结点)

在实际使用中,双链表比单链表方便很多,也更为灵活.对于不带头结点的非循环双链表的基本操作,我在<C语言实现双向非循环链表(不带头结点)的基本操作>这篇文章中有详细的实现.今天我们就要用两种不同的方式头插法和尾插法来建立双链表.代码上传至  https://github.com/chenyufeng1991/HeadInsertAndTailInsertDoubleList  . 核心代码如下: //尾插法创建不带头结点的非循环双向链表 Node *TailInsertCreateList(No

[C++11][数据结构]自己的双链表实现

这个双链表,是我模仿stl的list制作的,只实现了一些基本功能,像merge,transfer这些就没有实现,用户可以用基本操作来自己做外部实现. 我没有选用stl的[begin,end)迭代器模式,而是使用传统的[head,tail].不过,为了配合stl算法,我还是加了两个begin(),end()方法,模拟了一下stl容器.模拟的还算及格,至少我可以做类似for (; begin != end; ++begin)这样的事,也可以让我的容器搭配一些stl算法,这在之后的demo里可以看到.

双链表的实现

双链表:可以从一个表结点出发,在线性表中随意访问它的前驱结点和后继结点,双链表有两个指针. 双链表结template<class Elem> class Link   private:       static Link<Elem>* freelist ;//Head of the freelis   public: Elem element;//value for this node Link *next;//pointer to next node in list Link *