C語言實(shí)現(xiàn)雙向鏈表
這個小代碼是我憑自己對指針和鏈表的理解和認(rèn)識,自己實(shí)現(xiàn)的,沒有參考其他人的代碼,如果有相同的地方,那真的只是巧合,代碼我在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; /*向鏈表中插入數(shù)據(jù)*/ int insert_list(struct userdata *header, size_t position, char name[], size_t id); /*刪除鏈表中指定的節(jié)點(diǎn)*/ int delete_node(struct userdata *header, size_t position); /*修改指定位置的節(jié)點(diǎn)信息*/ int alter_node(struct userdata *header, size_t position, size_t id, char name[]); /*查找鏈表中的數(shù)據(jù)*/ struct userdata *search_node(struct userdata *header, size_t position); /*遍歷鏈表*/ int travel_list(struct userdata *header); /*判斷鏈表是空*/ int isempty(struct userdata *header); /*將鏈表結(jié)構(gòu)寫入文件*/ int write_into_file(struct userdata *header, FILE *fp); /*從文件讀取數(shù)據(jù)放到鏈表中*/ 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表示默認(rèn)插入到鏈表的尾部*/ 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; } /* 插入節(jié)點(diǎn) */ 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); /*當(dāng)position == 0時(shí),表示默認(rèn)插入到鏈表的尾部*/ if(0 == position){ if(NULL != temp_newuser -> next){ while(NULL != temp_newuser -> next){ temp_newuser = temp_newuser -> next; } } } /*當(dāng)position > 1時(shí)則尋找合適的位置插入*/ if(1 <= position){ for(int i = 0; i <= position; i++){ /*當(dāng)執(zhí)行此處的代碼時(shí)表示,鏈表已經(jīng)到達(dá)尾部或者是空鏈表*/ 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; } /*刪除鏈表中指定的節(jié)點(diǎn)*/ 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++ ){ /*當(dāng)執(zhí)行此處的代碼時(shí)表示,鏈表已經(jīng)到達(dá)尾部或者是空鏈表*/ if(NULL == deleteNode -> next){ break; } deleteNode = deleteNode -> next; } /**/ deleteNode -> next -> previous = deleteNode -> previous; deleteNode -> previous -> next = deleteNode -> next; free(deleteNode); return 0; } /*修改指定位置的節(jié)點(diǎn)信息*/ 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++ ){ /*當(dāng)執(zhí)行此處的代碼時(shí)表示,鏈表已經(jīng)到達(dá)尾部或者是空鏈表*/ if(NULL == alterNode -> next){ break; } alterNode = alterNode -> next; } alterNode -> userid = id; strncpy(alterNode -> username, name, 30); return 0; } /*查找鏈表中的數(shù)據(jù)*/ 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; } } /*將鏈表結(jié)構(gòu)寫入文件*/ 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; } /*從文件讀取數(shù)據(jù)放到鏈表中*/ 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)){/*當(dāng)讀取到文件的尾部時(shí).跳出循環(huán)*/ break; } readfile -> next = newread; newread -> next = NULL; newread -> previous = readfile; readfile = newread; } fclose(fp); fp = NULL; return 0; }
C語言實(shí)現(xiàn)雙向鏈表刪除節(jié)點(diǎn)、插入節(jié)點(diǎn)、雙向輸出等操作
#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數(shù)據(jù)輸入結(jié)束\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"); } //刪除一個結(jié)點(diǎ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("沒有找到想要刪除的數(shù)據(jù)\n"); return head; } //插入一個結(jié)點(diǎn) 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)//比頭結(jié)點(diǎn)數(shù)據(jù)小,插入到鏈表頭部 { 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//沒有找到合適的位置,只有將數(shù)據(jù)插入到鏈表尾部 { 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); } /***************************** 運(yùn)行結(jié)果如下: 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 數(shù)據(jù)輸入結(jié)束 正序輸出雙向鏈表: 1991 1992 2013 2014 512 420 逆序輸出雙向鏈表: 420 512 2014 2013 1992 1991 正序輸出雙向鏈表: 1012 1992 2013 2014 512 420 逆序輸出雙向鏈表: 420 512 2014 2013 1992 1012 ******************************/
以上就是本文給大家分享的全部內(nèi)容了,希望對大家更加熟悉C語言雙向鏈表能夠有所幫助。
相關(guān)文章
C++將二叉樹轉(zhuǎn)為雙向鏈表及判斷兩個鏈表是否相交
這篇文章主要介紹了C++將二叉樹轉(zhuǎn)為雙向鏈表及判斷兩個鏈表是否相交的方法,文中還給出了求兩個鏈表相交的第一個節(jié)點(diǎn)列的實(shí)現(xiàn)方法,需要的朋友可以參考下2016-02-02C++實(shí)現(xiàn)LeetCode(84.直方圖中最大的矩形)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(84.直方圖中最大的矩形),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C++實(shí)現(xiàn)將圖片轉(zhuǎn)換為馬賽克效果的示例代碼
這篇文章主要為大家詳細(xì)介紹了C++如何實(shí)現(xiàn)將圖片轉(zhuǎn)換為馬賽克效果,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下2023-01-01VSCode 配置C++開發(fā)環(huán)境的方法步驟
這篇文章主要介紹了VSCode 配置C++開發(fā)環(huán)境的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03C語言中操作sqlserver數(shù)據(jù)庫案例教程
這篇文章主要介紹了C語言中操作sqlserver數(shù)據(jù)庫案例教程,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07一起來學(xué)習(xí)C++的構(gòu)造和析構(gòu)
這篇文章主要為大家詳細(xì)介紹了C++構(gòu)造和析構(gòu),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03