国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > 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語言雙向鏈表能夠有所幫助。

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

圖片精選

主站蜘蛛池模板: 塘沽区| 夏邑县| 全州县| 会泽县| 姜堰市| 丹棱县| 绿春县| 南丹县| 高淳县| 石家庄市| 诸暨市| 林西县| 武平县| 东明县| 剑河县| 淅川县| 精河县| 祁东县| 鸡东县| 河曲县| 临清市| 吐鲁番市| 谷城县| 青州市| 蓝田县| 凌源市| 施秉县| 睢宁县| 呼图壁县| 鲁山县| 忻州市| 萨嘎县| 鹤庆县| 中牟县| 大方县| 都江堰市| 泰来县| 天门市| 南皮县| 清原| 新平|