• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C语言实现双向链表

C语言实现双向链表

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c语言双向链表,c语言双向循环链表,c语言创建双向链表,c语言双向链表实例,c语言实现链表等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

这个小代码是我凭自己对指针和链表的理解和认识,自己实现的,没有参考其他人的代码,如果有相同的地方,那真的只是巧合,代码我在ubuntu 15.04下测试通过,可能存在很多错误和漏洞.

doublelist.c

/*************************************************************************
  > File Name: doublelist.c
  > Author: ChenYiLiang
  > Mail: chenyiliangex@163.com 
  > Created Time: Sat 21 Mar 2015 07:32:22 PM CST
 ************************************************************************/
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct userdata{
  int userid;
  char username[30];
 
  struct userdata *previous;
  struct userdata *next;
};
 
 
 
struct userdata *header;
size_t scanf_id;
char scanf_name[30];
 
int yesno;
int deletePosition;
int alterPosition;
int alterId;
char alterName[30];
 
int searchPosition;
 
FILE *ptr_fpid;
 
/*向链表中插入数据*/
int insert_list(struct userdata *header, size_t position, char name[], size_t id);
/*删除链表中指定的节点*/
int delete_node(struct userdata *header, size_t position);
/*修改指定位置的节点信息*/
int alter_node(struct userdata *header, size_t position, size_t id, char name[]);
/*查找链表中的数据*/
struct userdata *search_node(struct userdata *header, size_t position);
/*遍历链表*/
int travel_list(struct userdata *header);
/*判断链表是空*/
int isempty(struct userdata *header);
 
/*将链表结构写入文件*/
int write_into_file(struct userdata *header, FILE *fp);
/*从文件读取数据放到链表中*/
int read_from_file(struct userdata *header, FILE *fp);
 
int main(){
  struct userdata *header_node = (struct userdata *)malloc(sizeof(struct userdata));
  header_node -> previous = NULL;
  header_node -> next = NULL;
 
  read_from_file(header_node, ptr_fpid);
  travel_list(header_node);
  while(1){
  //scanf("%*[^\n]");
  //scanf("%*c");
  //scanf("%*[^\n]");
  printf("please input id - ");
  scanf("%d", &scanf_id);
  //scanf("%*c");
  //scanf("%*[^\n]");
  printf("please input your name - ");
  scanf("%s", scanf_name);
 
  printf("%d - %s\n\n", scanf_id, scanf_name);
 
  //isempty(header_node);
 
  /*0表示默认插入到链表的尾部*/
  insert_list(header_node, 0, scanf_name, scanf_id);
   
  //write_into_file(header_node, ptr_fpid);
  //isempty(header_node);
 
 
    printf("input anymore - ");
    scanf("%d", &yesno);
    if(yesno == -1){
      break;
    }
 
  scanf("%*c");
  scanf("%*[^\n]");
// travel_list(header_node);
 
  }
  getchar();
  //printf("delete position data - ");
  //scanf("%d", &deletePosition);
  //delete_node(header_node, deletePosition);
 
// printf("alter data for position - ");
// scanf("%d", &alterPosition);
// printf("please inout new id - ");
// scanf("%d",&alterId);
// printf("please input new name - ");
// scanf("%s", alterName);
// alter_node(header_node, alterPosition, alterId, alterName);
  write_into_file(header_node, ptr_fpid);
  travel_list(header_node);
  printf("\n\n");
  printf("please input position to search - ");
  scanf("%d", &searchPosition);
  struct userdata *searchData = search_node(header_node, searchPosition);
  printf("%d\n", searchData -> userid);
  printf("%s\n", searchData -> username);
  return 0;
}
 
/* 插入节点 */
int insert_list(struct userdata *header, size_t position, char name[], size_t id ){
  struct userdata *temp_newuser = header;
  struct userdata *getMemory = (struct userdata *)malloc(sizeof(struct userdata));
 
  getMemory -> userid = id;
  strncpy(getMemory -> username, name, 30);
  /*当position == 0时,表示默认插入到链表的尾部*/
  if(0 == position){
    if(NULL != temp_newuser -> next){
      while(NULL != temp_newuser -> next){
        temp_newuser = temp_newuser -> next;
      }
    }
  }
 
  /*当position > 1时则寻找合适的位置插入*/
  if(1 <= position){
    for(int i = 0; i <= position; i++){
      /*当执行此处的代码时表示,链表已经到达尾部或者是空链表*/
      if(NULL == temp_newuser -> next){
        break;
      }
      temp_newuser = temp_newuser -> next;
    }
  }
 
  getMemory -> previous = temp_newuser;
  if(temp_newuser -> next == NULL){
    temp_newuser -> next = getMemory;
    getMemory -> next = NULL; 
  }else{
    temp_newuser -> next -> previous = getMemory;
    getMemory -> next = temp_newuser -> next;
    temp_newuser -> next = getMemory;
  }
 
  return 0;
}
 
/*删除链表中指定的节点*/
int delete_node(struct userdata *header, size_t position){
  int is_empty = isempty(header);
  if(0 == is_empty){
    printf("this si a empty list!\n\n");
    return -1;
  }
 
  struct userdata *deleteNode = header;
 
    for(int i = 0; i < position; i++ ){
      /*当执行此处的代码时表示,链表已经到达尾部或者是空链表*/
      if(NULL == deleteNode -> next){
        break;
      }
      deleteNode = deleteNode -> next;
    }
 
  /**/
  deleteNode -> next -> previous = deleteNode -> previous;
  deleteNode -> previous -> next = deleteNode -> next;
  free(deleteNode);
 
  return 0;  
}
 
/*修改指定位置的节点信息*/
int alter_node(struct userdata *header, size_t position, size_t id, char name[]){
  int isEmpty = isempty(header);
  if(0 == isEmpty){
    printf("this is a empty list\n\n");
    return -1;
  }
   
  struct userdata *alterNode = header; 
    for(int i = 0; i < position; i++ ){
      /*当执行此处的代码时表示,链表已经到达尾部或者是空链表*/
      if(NULL == alterNode -> next){
        break;
      }
      alterNode = alterNode -> next;
    }
 
    alterNode -> userid = id;
    strncpy(alterNode -> username, name, 30);
 
  return 0;
}
 
/*查找链表中的数据*/
struct userdata *search_node(struct userdata *header, size_t position){
  int isEmpty = isempty(header); 
  if(0 == isEmpty){
    printf("this is a empty!\n");
    return NULL;
  }
 
  struct userdata *searchNode = header;
  for(int i = 0; i < position; i++){
    if(NULL == searchNode -> next){
      break;
    }
    searchNode = searchNode -> next;
  }
 
  return searchNode;
}
 
/*遍历链表*/
int travel_list(struct userdata *header){
  struct userdata *travel = header;
  if(NULL == travel -> next){
    printf("This is a empty list!!\n");
    return 1;
  }
   
  for(travel = travel -> next ; ; travel = travel -> next){
    printf("%d\n",travel -> userid);
    printf("%s\n", travel -> username);
    if(NULL == travel -> next){
      break;
    }
  }  
 
  return 1;
}
 
/*判断链表是空*/
int isempty(struct userdata *header){
  if(header -> next == NULL){
    return 0;
  }else{
    return 1;
  }
}
 
/*将链表结构写入文件*/
int write_into_file(struct userdata *header, FILE *fp){
  fp = fopen("listdata", "wb");
  if(NULL == fp){
    perror("open file failed when write into file!"),exit(-1);
  }
 
  printf("come into write!\n");
  for(struct userdata *move = header -> next; ; move = move -> next){
    fwrite(move,sizeof(struct userdata), 1, fp);
    if(NULL == move -> next){
      break;
    }
  }
  fclose(fp);
  fp = NULL;
  return 0;
}
/*从文件读取数据放到链表中*/
int read_from_file(struct userdata *header, FILE *fp){
  struct userdata *readfile = header;
  fp = fopen("listdata", "rb");
  if(NULL == fp){
    perror("open file failed when read - ");
    return -1;
  }
 
  while(1){
    struct userdata *newread = (struct userdata *)malloc(sizeof(struct userdata));
    fread(newread, sizeof(struct userdata), 1, fp);
    if(feof(fp)){/*当读取到文件的尾部时.跳出循环*/
      break;
    }
    readfile -> next = newread;
    newread -> next = NULL;
    newread -> previous = readfile;
    readfile = newread;
  }
  fclose(fp);
  fp = NULL;
  return 0;
}
</div>

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C语言双向链表实现根据使用频率安排元素位置的功能实例代码
  • C语言数据结构 双向链表的建立与基本操作
  • C语言实现数据结构和双向链表操作
  • C语言 数据结构双向链表简单实例
  • C语言之双向链表详解及实例代码
  • C语言创建和操作单链表数据结构的实例教程
  • C语言实现双向链表
  • C语言创建链表错误之通过指针参数申请动态内存实例分析
  • C语言双向链表的表示与实现实例详解
  • C语言单向链表的表示与实现实例详解

相关文章

  • 2017-05-28C++实现简单遗传算法
  • 2017-05-28Cocos2d-x UI开发之菜单类使用实例
  • 2017-05-28详谈signed 关键字
  • 2017-05-28C语言顺序表实现代码排错
  • 2017-05-28C语言中字符的输入输出以及计算字符个数的方法详解
  • 2017-05-28VC++创建msi文件的方法
  • 2017-05-28C语言 字符串指针详解及示例代码
  • 2017-05-28在C++中自定义宏的简单方法
  • 2017-05-28c++ String去除头尾空格的方法
  • 2017-05-28简单谈谈C++ 头文件系列之(algorithm)

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C 语言指针概念的详解
    • C++对象内存分布详解(包括字节对齐和虚函数表)
    • 纯c语言实现面向对象分析与示例分享
    • 应用程序操作NorFlash示例代码分享(norflash接口使用方法)
    • C++ AfxBeginThread的介绍/基本用法
    • COLORREF,COLOR,RGB,CString的转化总结分析
    • C++中的RAII机制详解
    • C++中关于Crt的内存泄漏检测的分析介绍
    • 最长公共子序列
    • SublimeText编译C开发环境设置

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有