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

来源:互联网 发布:mac风扇一直转 编辑:程序博客网 时间:2024/05/19 12:40
声明部分,头文件 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");}

0 0
原创粉丝点击