您的位置:首页 > 其它

双链表:实现基本的增删查改,正反向现实双链表的节点

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




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  双链表