亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言實現雙向鏈表

2020-01-26 15:09:06
字體:
來源:轉載
供稿:網友

這個小代碼是我憑自己對指針和鏈表的理解和認識,自己實現的,沒有參考其他人的代碼,如果有相同的地方,那真的只是巧合,代碼我在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;}

C語言實現雙向鏈表刪除節點、插入節點、雙向輸出等操作

#include<cstdio>  #include<cstdlib>  typedef struct DoubleLinkedList {   int data;   struct DoubleLinkedList *pre;   struct DoubleLinkedList *next; }DlinkedList_Node; //建立鏈表  DlinkedList_Node* createDLink() {   DlinkedList_Node *head,*p,*s;   int x;   head = (DlinkedList_Node*)malloc(sizeof(DlinkedList_Node));   p = head;   while(1)   {     printf("please input the data: /n");     scanf("%d",&x);     if(x != 65535)     {       s = (DlinkedList_Node*)malloc(sizeof(DlinkedList_Node));       s ->data = x;       s-> pre = p;       p->next = s;       p=s;     }     else       {         printf("/n數據輸入結束/n");         break;       }   }   p->next = NULL;   head = head ->next;   head->pre = NULL;   return head; } //順序、反序打印鏈表  void printDLink(DlinkedList_Node *head) {   DlinkedList_Node *p,*s;   p = head;   printf("正序輸出雙向鏈表:/n");   while(p)   {     printf("%d ",p->data);     s = p;     p = p->next;   }   printf("/n 逆序輸出雙向鏈表: /n");   while(s)   {     printf("%d ",s->data);     s = s->pre;   }   printf("/n /n"); } //刪除一個結點  DlinkedList_Node* deleteDlinkedList_Node(DlinkedList_Node *head,int i) {   DlinkedList_Node *p;   p = head;   if(p->data == i)   {     head = p->next;     head->pre = NULL;     free(p);     return head;   }   while(p)   {     if(p->data == i)     {     p->pre->next = p->next;     p->next->pre = p->pre;     free(p);     return head;     }     p = p->next;   }   printf("沒有找到想要刪除的數據/n");   return head; } //插入一個結點  DlinkedList_Node* insertDlinkedList_Node(DlinkedList_Node *head,int i) {   DlinkedList_Node *p,*temp;   p = head;   temp = (DlinkedList_Node*)malloc(sizeof(DlinkedList_Node));   temp ->data = i;   if(i < p->data)//比頭結點數據小,插入到鏈表頭部    {     head = temp;     head->next = p;//此處p為原來的head      head->pre = NULL;     p->pre = head;//此處p為原來的head      return head;   }   while(p != NULL && i > p->data)//尋找合適的插入位置    {     p = p->next;   }   if(i < p->data)//在鏈表中間某處找到合適插入位置    {     temp ->next = p;     temp ->pre = p->pre;     p ->pre->next = temp;     p ->pre = temp;     return head;   }   else//沒有找到合適的位置,只有將數據插入到鏈表尾部    {     p->next = temp; //遍歷到鏈表尾部,p==NULL      temp ->pre = p;     temp ->next = NULL;     return head;   } } int main() {   DlinkedList_Node *head;   head = createDLink();   printDLink(head);   head = insertDlinkedList_Node(head,1012);   head = deleteDlinkedList_Node(head,1991);   printDLink(head); } /***************************** 運行結果如下: please input the data: 1991 please input the data: 1992 please input the data: 2013 please input the data: 2014 please input the data: 512 please input the data: 420 please input the data: 65535  數據輸入結束 正序輸出雙向鏈表: 1991 1992 2013 2014 512 420  逆序輸出雙向鏈表: 420 512 2014 2013 1992 1991  正序輸出雙向鏈表: 1012 1992 2013 2014 512 420  逆序輸出雙向鏈表: 420 512 2014 2013 1992 1012  ******************************/ 

以上就是本文給大家分享的全部內容了,希望對大家更加熟悉C語言雙向鏈表能夠有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人性生交xxxxx网站| 亚洲最大福利视频| 国产精品三级网站| 欧美激情女人20p| 国产精品入口日韩视频大尺度| 欧美性理论片在线观看片免费| 美女久久久久久久久久久| 亚洲人成电影网站色…| 日韩视频欧美视频| 性色av一区二区咪爱| 日韩av成人在线| www.亚洲免费视频| 国产91色在线免费| 久久久久久久网站| 97超碰色婷婷| 欧美xxxx做受欧美.88| 亚洲色图13p| 亚洲欧美另类在线观看| 色爱精品视频一区| 国产精品成人一区二区| 最好看的2019年中文视频| 91久久国产综合久久91精品网站| 欧美在线精品免播放器视频| 亚洲欧美国产精品| 欧美中文字幕在线| 欧美另类69精品久久久久9999| 欧美有码在线观看| 亚洲天堂av图片| 国产精品久久久久久久电影| 国产日韩精品在线播放| 日本高清不卡在线| 欧洲亚洲免费在线| 狠狠躁夜夜躁久久躁别揉| 国产在线观看一区二区三区| 超碰97人人做人人爱少妇| 欧洲成人在线观看| 色婷婷av一区二区三区久久| 日韩在线观看网址| 久久久久久久91| 久久亚洲一区二区三区四区五区高| 一本大道亚洲视频| 欧美国产在线视频| 久久精品视频中文字幕| 久久久国产精品x99av| 国模精品一区二区三区色天香| 欧美理论在线观看| 中文字幕日韩欧美| 成人欧美在线视频| 精品五月天久久| 欧美裸体xxxx极品少妇软件| 久久久亚洲福利精品午夜| 日韩国产精品视频| 中文字幕在线观看亚洲| 一区二区在线视频播放| 亚洲成人免费在线视频| 2019中文在线观看| 中文字幕视频一区二区在线有码| 成人免费观看49www在线观看| 中文字幕日韩专区| 国产一区二区美女视频| 亚洲国产日韩欧美在线图片| 欧美人成在线视频| 在线电影av不卡网址| www.欧美精品| 久久艹在线视频| 欧美日韩一区二区三区| 成人h视频在线观看播放| 91欧美精品成人综合在线观看| 日韩av大片免费看| 久热精品视频在线观看一区| 成人中文字幕在线观看| 91九色视频导航| 日韩免费观看视频| 最近中文字幕日韩精品| 91在线免费网站| 亚洲第一视频网| 欧美亚洲日本网站| 91精品国产91久久久久久最新| 精品国产91久久久| 中文字幕亚洲欧美日韩2019| 国模精品视频一区二区| 国产精品一区二区久久久久| 国产在线精品成人一区二区三区| 日韩av在线网址| 精品视频在线播放色网色视频| 亚洲一区久久久| 亚洲va欧美va国产综合剧情| 色婷婷久久av| 欧美中文在线免费| 777777777亚洲妇女| 亚洲国产高潮在线观看| 国产一区二区三区视频免费| 国产免费一区二区三区在线能观看| 中文字幕亚洲情99在线| 在线电影中文日韩| 国产精品视频公开费视频| 欧美亚洲成人精品| 国产99视频在线观看| 日韩女优人人人人射在线视频| 久久久久久久电影一区| 久久精品国产2020观看福利| 国产日韩欧美影视| 亚洲自拍av在线| 这里只有精品久久| 欧美寡妇偷汉性猛交| 亚洲天堂免费观看| 国产999精品久久久影片官网| 日韩不卡中文字幕| 日韩欧美国产一区二区| 亚洲人成毛片在线播放| 亚洲精品乱码久久久久久按摩观| 久久久免费电影| 久久频这里精品99香蕉| 这里只有精品视频| 日韩精品在线免费观看视频| 少妇高潮久久久久久潘金莲| 国产网站欧美日韩免费精品在线观看| 亚洲a一级视频| 久久999免费视频| 国产精品免费观看在线| 日韩精品视频免费专区在线播放| 欧美电影免费观看| 亚洲欧美日韩国产中文| 成人欧美一区二区三区在线湿哒哒| 亚洲一区国产精品| 久久久精品一区二区| 国产日本欧美一区二区三区在线| 精品视频9999| 欧美黑人xxx| 668精品在线视频| 色多多国产成人永久免费网站| 久久久久国产视频| 国产午夜精品久久久| 亚洲成人网在线观看| 中文字幕精品—区二区| 国产日本欧美一区| 日韩有码在线播放| 国产精品7m视频| 精品久久香蕉国产线看观看亚洲| 色老头一区二区三区在线观看| 精品久久久久久久久久| 欧美乱大交xxxxx另类电影| 91成品人片a无限观看| 九九精品在线视频| 国产精品久久久久久影视| 欧美精品午夜视频| 亚洲国产小视频在线观看| 亚洲黄色www网站| 国产精品男女猛烈高潮激情| 欧洲成人免费视频| 综合136福利视频在线| 97香蕉超级碰碰久久免费软件| 日韩中文字幕免费视频| 久久免费精品视频| 国产精品偷伦免费视频观看的| 亚洲一区二区三区777| 亚洲 日韩 国产第一| 日韩欧美在线播放| 亚洲精品国产欧美| 2018中文字幕一区二区三区| 亚洲国产成人在线视频| 原创国产精品91| 成人中文字幕+乱码+中文字幕| 在线播放亚洲激情|