线性结构之双链表实现

#include<stdio.h>

#include<malloc.h>

#include<stdlib.h>

typedef struct node

{

int data;

struct node * prior;

struct node * next;

}NODE,*PNODE;

PNODE createList(PNODE);

void travelList(PNODE);

void insertList(PNODE,int,int);

int lengthList(PNODE);

void delList(PNODE,int,int *);

void main()

{

//头结点是需要造出来的,给他分配空间

PNODE phead=(PNODE)malloc(sizeof(NODE));

if(NULL==phead)

{

printf("内存分配失败");

exit(-1);

}

phead->next=NULL;

phead->prior=NULL;

//创建双链表

phead=createList(phead);

//遍历双链表

travelList(phead);

printf("\n");

//链表的插入

insertList(phead,2,3);

//遍历双链表

travelList(phead);

printf("\n");

printf("开始准备删除结点\n");

int val;

//链表结点删除

delList(phead,2,&val);

//遍历双链表

travelList(phead);

printf("\n");

}

PNODE createList(PNODE phead)

{

int len;

int val;

PNODE p=phead;

printf("请输入要初始化结点的个数:");

scanf("%d",&len);

for(int i=0;i<len;i++)

{

PNODE pnew=(PNODE)malloc(sizeof(NODE));

if(pnew==NULL)

{

printf("内存分配失败");

exit(-1);

}

printf("请输入给当前第%d个结点赋值",i+1);

scanf("%d",&val);

pnew->data=val;

pnew->prior=NULL;

pnew->next=NULL;

pnew->next=p->next;

pnew->prior=p;

p->next=pnew;

p=pnew;

}

return phead;

}

void delList(PNODE phead,int pos,int *val)

{

int i=0;

PNODE p=phead;

if(p==NULL||pos<1||pos>lengthList(phead))

{

printf("无法删除,删除不合法");

return;

}

while(i<pos-1)

{

p=p->next;

i++;

}

PNODE q=p->next;

*val=q->data;

printf("%d         ",*val);

p->next=p->next->next;

p->next->prior=p;

free(q);

}

void travelList(PNODE phead)

{

PNODE pnew=phead->next;

while(pnew!=NULL)

{

printf("%d ",pnew->data);

pnew=pnew->next;

}

}

void insertList(PNODE phead,int pos,int val)

{

PNODE p=phead;

int i=0;

if(p==NULL||pos<1||pos>lengthList(phead))

{

printf("无法插入结点,不合法");

exit(-1);

}

while(i<pos-1)

{

p=p->next;

i++;

}

//初始化结点

PNODE pnew=(PNODE)malloc(sizeof(NODE));

pnew->data=val;

pnew->next=NULL;

pnew->prior=NULL;

//准备插入结点

pnew->next=p->next;

p->next->prior=pnew;

pnew->prior=p;

p->next=pnew;

}

int lengthList(PNODE phead)

{

PNODE pnew=phead;

int i=0;

while(pnew!=NULL)

{

pnew=pnew->next;

i++;

}

return i;

}

时间: 2024-10-10 08:39:54

线性结构之双链表实现的相关文章

线性结构-数组和链表的实现

连续存储(数组) 1.什么叫数组? 元素的类型相同,大小相等. 2.优缺点? 查询速度快,增加删除慢 #include <stdio.h> #include <malloc.h> #include <stdlib.h> //定义一个数据类型,名字 Arr,成员分别 struct Arr { int * pBase; //存储的是数组第一个元素的地址 int len; //数组的长度 int cnt; //当前数组有效元素的个数 int increment; //自动增长

数据结构 线性结构(数组[列表] ,链表 单链表的增删改查**, 线性结构的应用 队列 栈[函数的调用**]),非线性结构 树

数据结构 参考:http://lupython.gitee.io/ 线性结构 就是能够用一根线串起来的数据结构 数组 (列表) 问:申请数组的前提条件是啥? a[12]?内存需要满足的条件? 答:内存必须有一块连续的内存空间 int a[7] : 声明一个数组,这个数组的数组名是 a, 数组的大小是 7, 数组元素的类型是整型. int a[7] = array(1,2,3,4,5,6,7) 问:如何申请内存? 答:C,C++语言,申请:mallco (28).释放:free(28) 问:int

数据结构和算法-数据结构-线性结构-顺序表 链表和哈希表

####################################################### """ # 线性表是最基本的数据结构之一,在实际程序中应用非常广泛,它还经常被用作更复杂的数据结构的实现基础. # 根据线性表的实际存储方式,分为两种实现模型: # 顺序表, # 链表, # 下面分别进行研究, """ ####################################################### &qu

线性表之双链表

#include<iostream> using namespace std; struct LinkNode { int value; LinkNode* next; LinkNode* pre; }; LinkNode* createDoubleLinkList() { LinkNode* head = (LinkNode*)malloc(sizeof(LinkNode)); head->next=NULL; head->pre=NULL; head->value=0;

线性结构栈之链表实现

#include<stdio.h> #include<malloc.h> #include<stdlib.h> //结点数据类型 typedef struct Node { int data; struct Node *next; }NODE,*PNODE; //栈数据类型 typedef struct { PNODE top; int cnt; }Stack; //想想看,为什么栈的数据结构是这样,我是这样思考的,如果你不这样写可以, //那你必须造出一个计数的结点和

【算法和数据结构】_13_小算法_双链表

没什么新的内容,把自己写的练习代码贴出来,供大家批判. 1 /* 2 本程序用来测试非线性存储结构:双链表 3 */ 4 5 6 #include <stdio.h> 7 #include <stdlib.h> 8 9 10 //**************************************************0 11 // 定义双链表数据结构 12 struct dbllink 13 { 14 char data; 15 struct dbllink* preN

线性表—双链表

1.基础知识 a.双链表结点的结构:其由前序元素地址,数据域,后继元素地址组成. b.双链表结点的连接方法:先声明该结点,可以在内部也可以利用其特性来表明前序结点和后继结点是什么,之后同时还需要说明"其前序结点的后继地址为该结点"和"其后继结点的前序地址为该结点.(本质:双向) 2.循环双链表的实现 线性表接口LList package com.clarck.datastructure.dlinked; /*** 线性表接口LList,描述线性表抽象数据类型,泛型参数T表示数

[大话数据结构]线性表之单链表结构和顺序存储结构

线性表定义: 零个或者多个数据元素的有限序列.元素之间是有顺序的,如果元素存在多个,则第一个元素无前驱,最后一个元素无后继.其他每个元素都有且只有一个前驱和后继.并且数据元素的类型要相同. 线性表的抽象数据类型: ADT 线性表(List) Data 线性表的数据对象集合为{a1,a2,...,an},每个元素的类型均为DataType. 其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素. 数据元素之间的关系是一对一的关系.

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

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