双链表基本操作

原创 2013年12月03日 21:04:14

详细描述:

  • 数据结构(结构体strlnode)定义:

  • data保存节点的值

  • plast指向上一个节点

  • pnext指向下一个节点

  • 下面的所有接口实现中,头结点也表示一个保存实际值的节点

  • 实现接口,每个接口实现1个基本操作:

  • voidcreate(structstrlnode **p,intx):创建1个头节点,头节点表示第0个节点,x表示头节点保存的值,该函数已经实现。

  • voidinsertnode(structstrlnode **p,inti,intx):在链表的第i个位置插入数值为x的节点,需考虑i异常。

  • voiddeletenode(structstrlnode **p,inti):删除链表的第i个节点,需释放该节点占用的内存,需考虑i异常。

  • intgetnodenum(structstrlnode **p):获取链表的节点个数,空链表返回0。

  • voidbignumberplus(structstrlnode **plus,structstrlnode **p,structstrlnode **q):实现两个大整数相加,链表p和链表q中存储两个大整数,相加后的整数存储到plus中。

  • voidreadtolnode(structstrlnode **p,int*a,intsize):将数组a中的数据存储到链表p当中,size为存储的数值的个数。该函数已经实现,举例如下:

123+4567=4690

p: [plast|data=1|pnext]<-> [plast|data=2|pnext] <-> [plast|data=3|pnext]<-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><->

q:[plast|data=4|pnext]<-> [plast|data=5|pnext] <-> [plast|data=6|pnext] <-> [plast|data=7|pnext]<-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><->

plus:[plast|data=4|pnext]<-> [plast|data=6|pnext] <-> [plast|data=9|pnext] <-> [plast|data=0|pnext]<-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><->

a[3] = {1,2,3},存储到链表中的顺序和在数组中顺序保持一致:

[plast|data=1|pnext]<-> [plast|data=2|pnext] <-> [plast|data=3|pnext]<-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><->

  • voidwritetosqlist(int*a,structstrlnode *p):将链表p中的数据存储到数组a中。该函数已经实现,举例如下:

[plast|data=1|pnext]<-> [plast|data=2|pnext] <-> [plast|data=3|pnext]<-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><->,存储到数组中的顺序和在链表中的顺序保持一致:a[3] = {1,2,3}

  • 题目框架中有7个参考用例,其它用例请执行编写

  • 重要说明:代码没有实现之前跑用例会访问越界,不用急于解决,代码实现之后问题消失。


#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 readtolnode(struct strlnode **p, int *a, int size);
int getnodenum(struct strlnode **p);  
void writetosqlist(int *a, struct strlnode *p);
void readtolnode(struct strlnode **p, int *a, int size);


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;

}


void insertnode(struct strlnode **p, int i, int x) /* 在链表第i个位置插入数据等于x的节点 */
{
/* 代码在这里实现 */
struct strlnode *q, *q0;


q = (struct strlnode *)malloc(sizeof(struct strlnode));
q0 = (struct strlnode *)malloc(sizeof(struct strlnode));
q0 = *p;

q->data = x;
int number = getnodenum(&*p);
if ((i<= number) && (i > 0))
{
for (int j = 0; j < i-1; j++)
{
q0 = q0->pnext;
}
if (q0->pnext == NULL)
{
q->pnext = q0->pnext;
q0->pnext = q;
q->plast = q0;
}
else
if (q0->pnext != NULL)
{
q->pnext = q0->pnext;
q->plast = q0;
q0->pnext->plast = q;
q0->pnext = q;
}
}

else if (i == 0)
{
q->pnext = q0;
q0->plast = q;
*p = q;
}
}


void deletenode(struct strlnode **p, int i) /* 删除链表中第i个节点 */
{
/* 代码在这里实现 */
struct strlnode *q;
q = (struct strlnode *)malloc(sizeof(struct strlnode));
q = *p;
int number = getnodenum(&*p);


if (i <= number)
{
for (int j = 0; j < i; j++)
{
q= q->pnext;
}
}
if (q->pnext == NULL)
{
q->plast->pnext = NULL;
free(q);
}
else if(q->plast == NULL)
{
q->pnext->plast = q->plast;
free(q);
}
else if((q->plast != NULL) && (q->pnext != NULL))
{
q->plast->pnext = q->pnext;
q->pnext->plast = q->plast;
free(q);
}

}


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


void bignumberplus(struct strlnode **plus, struct strlnode **p, struct strlnode **q) /* 使用链表实现大整数相加 */
{
/* 代码在这里实现 */
int num1, num2, maxnum;
num1 = getnodenum(p);
num2 = getnodenum(q);
maxnum = (num1>num2?num1: num2);


struct strlnode *tempp;
struct strlnode *tempq;


tempp = *p;
tempq = *q;


int *a = new int [num1];
int *b = new int [num2];
int *c = new int [maxnum];
int flag = 0;
int temp_value;


writetosqlist(a, &*tempp);
writetosqlist(b, &*tempq);


int i, j, k;
for (i = num1-1, j = num2-1, k = maxnum-1; (i >= 0) && (j >= 0) && (k >= 0); i--, j--, k--)
{
temp_value = a[i] + b[j] + flag;
if (temp_value >= 10)
{
flag = 1;
}
if (temp_value < 10)
{
flag = 0;
}
c[k] = temp_value % 10;
}


if (i > 0)
{
for (; i>=0; i--,k--)
{
c[k] = a[i] + flag;
flag = 0;
}



}


if (j > 0)
{
for (; j>=0; j--,k--)
{
c[k] = b[j] + flag;
flag = 0;
}
}


readtolnode(plus, c, maxnum);


if (flag == 1)
{
insertnode(plus, 0, 1);
}




delete []a;
delete []b;
delete []c;
}




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;
}

相关文章推荐

单链表和双链表的基本操作实例

  • 2016年04月20日 14:03
  • 3.63MB
  • 下载

c++ 实现双链表基本操作

#include #include #include #include /*c++实现双链表的基本操作*/ using namespace std; typedef struct stude...

双链表的基本操作(经过测试的)

// Note:Your choice is C++ IDE#include #include #include using namespace std;typedef struct node{int...

OJ 系列之【中级】双链表基本操作

#include #define null 0 #define MAXSIZE 50struct strlnode { int data; struct strlnode *plast...

双链表基本操作。

双链表 (double link) 最近学习了链表。相比较单链表的只有一个后继结点的小清新风格而言。双链表中前驱结点和后继结点就稍显麻烦。 本人在学习双链表的过程中就被满天飞的前驱后继指针弄...
  • okoney
  • okoney
  • 2012年12月10日 11:50
  • 841

[C语言]双链表各种基本操作

#include typedef struct doubleLink { int data; struct doubleLink *pre; s...

双链表基本操作

看欧立奇的《程序员面试宝典》的双向链表部分,发现其中创建双向链表和删除链表中得某一点的程序存在问题,现将已经调试通过的程序贴在下面: #include using namespace std...

双链表的基本操作

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。       为了练习,...

线性表之双链表基本操作

/* *姓名:刘金石 *时间2017年2月5日 *线性表之双链表基本操作 */ #include #include //双链表的存储结构 typedef char ElemType; ty...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:双链表基本操作
举报原因:
原因补充:

(最多只允许输入30个字)