双链表:实现基本的增删查改,正反向现实双链表的节点
2015-08-06 00:30
323 查看
声明部分,头文件 list.h
#include <stdio.h> #include <stdlib.h> //双链表节点 typedef struct LinkNode { int data; struct LinkNode *pPre; struct LinkNode *pNext; }node; typedef struct head { node *head;//指向头部 node *tail;//指向尾部 }List; //初始化链表 void init(List *p); //头插 void adddatahead(List *p, int data); //尾插 void adddataback(List *p, int data); //正向显示链表 void show(List *p); //反向显示链表 void revshow(List *p); //查找 node * find(List *p,int data); //反向查找 node * revfind(List *p,int data); //插入数据 void insertdata(List *p, int data,int newdata); //删除数据 void deletedata(List *p, int data);
-----------------------------------------------
定义部分 list.c
#include "list.h"
void init(List *p)
{
p->head = p->tail = NULL;
}
void adddatahead(List *p, int data)
{
node *pnew = malloc(sizeof(node));
pnew->data = data;
pnew->pNext = NULL;
pnew->pPre = NULL;//创建一个节点
if (NULL==p->head ||NULL==p->tail)
{
p->head = pnew;
p->tail = pnew;//插入一个结点,没有节点
}
else
{
p->head->pPre = pnew;//前驱
pnew->pNext = p->head;//后继
p->head = pnew;//插入,头插
}
}
//不需要循环到尾部 改变尾节点的指针即可
void adddataback(List *p, int data)
{
node *pnew = malloc(sizeof(node));
pnew->data = data;
pnew->pNext = NULL;
pnew->pPre = NULL;//创建一个节点
if (p->head == NULL || p->tail == NULL)
{
p->head = pnew;
p->tail = pnew;//插入一个基点,没有节点
}
else
{
p->tail->pNext = pnew;//后继
pnew->pPre = p->tail;//插入节点的前驱
p->tail = pnew;//尾部节点
}
}
void show(List *p)
{
node *pshow = p->head;
while (pshow!=NULL)
{
printf("%4d", pshow->data);
pshow = pshow->pNext;
}
printf("\n");
}
void revshow(List *p)
{
node *pshow = p->tail;
while (pshow != NULL)
{
printf("%4d", pshow->data);
pshow = pshow->pPre;
}
printf("\n");
}
node * find(List *p,int data)
{
node *pshow = p->head;
while (pshow != NULL)
{
if (pshow->data==data)
{
return pshow;
}
pshow = pshow->pNext;
}
return NULL;
}
node * revfind(List *p,int data)
{
node *pshow = p->tail;
while (pshow != NULL)
{
if (pshow->data==data)
{
return pshow;
}
pshow = pshow->pPre;
}
return NULL;
}
void insertdata(List *p, int data, int newdata)
{
node *pnew = malloc(sizeof(node));
pnew->data = newdata;
pnew->pNext = NULL;
pnew->pPre = NULL;//创建一个节点
node *p1 = NULL;
p1 = p->head;
while (p1 != NULL)
{
if (p1->data != data)
{
p1 = p1->pNext;
}
else
{
break;
}
}
//中间
if (p1 != p->head && p1 != p->tail)
{
pnew->pNext = p1;
pnew->pPre = p1->pPre;
p1->pPre->pNext = pnew;
p1->pPre = pnew;
}
//头部
else if (p1 == p->head)
{
p1->pPre = pnew;
pnew->pNext = p1;
p->head = pnew;
}
//尾部
else if (p1 == p->tail)
{
pnew->pNext = p1;
pnew->pPre = p1->pPre;
p1->pPre->pNext = pnew;
p1->pPre = pnew;
}
}
void deletedata(List *p, int data)
{
node *p1 = NULL;
p1 = p->head; //p1记录下找到的位置
while (p1!=NULL)
{
if (p1->data!=data )
{
p1 = p1->pNext;//不等,就继续循环下去
}
else
{
break;
}
}
//中间
if (p1!=p->head && p1!=p->tail)
{
p1->pPre->pNext = p1->pNext;
p1->pNext->pPre = p1->pPre;
free(p1);
}
//头部
else if (p1==p->head)
{
p->head = p1->pNext;
p1->pNext->pPre = NULL;
free(p1);
}
//尾部
else if (p1==p->tail)
{
p->tail = p1->pPre;
p1->pPre->pNext = NULL;
free(p1);
}
}
------------------------------------------
主函数测试部分 main.c
<pre name="code" class="cpp">void main() { List dlist; init(&dlist); printf("头部插入节点:\n"); adddatahead(&dlist, 10); adddatahead(&dlist, 20); adddatahead(&dlist, 30); adddatahead(&dlist, 40); adddatahead(&dlist, 50); show(&dlist); printf("反向显示:\n"); revshow(&dlist); printf("\n\n尾部插入节点:\n"); adddataback(&dlist, 11); adddataback(&dlist, 12); adddataback(&dlist, 13); adddataback(&dlist, 14); adddataback(&dlist, 15); show(&dlist); printf("反向显示:\n"); revshow(&dlist); printf("\n\n查找节点30,并修改为999:\n"); node *pfind = find(&dlist, 30); pfind->data = 999; revshow(&dlist); printf("\n\n删除插入节点40,插入节点99:\n"); deletedata(&dlist, 40); revshow(&dlist); insertdata(&dlist, 15, 99); revshow(&dlist); system("pause"); }
相关文章推荐
- C数据结构之双链表详细示例分析
- PHP 双链表(SplDoublyLinkedList)简介和使用实例
- 双链表实现的消息队列,可支持优先级读取
- C语言一个双向链表的实现
- 线性表
- LRU缓存介绍与实现 (Java)
- 双向链表
- BDS之链表
- 设计并实现一个LRU Cache
- 链表初解(二)——双链表的创建、删除、插入
- 数据结构之双向链表的Java实现
- 数据结构之双链表
- 线性表--双链表实现方式 (JAVA)
- 双链表基本操作
- C++实现的双链表通用模板
- 将二叉排序树转化成双链表
- Linux双向链表(一)——基础操作增、删、改
- C+双链表
- 双向链表
- Map中LinkedHashMap和HashMap的区别