C語言實(shí)現(xiàn)雙向鏈表
這個(gè)小代碼是我憑自己對(duì)指針和鏈表的理解和認(rèn)識(shí),自己實(shí)現(xiàn)的,沒有參考其他人的代碼,如果有相同的地方,那真的只是巧合,代碼我在ubuntu 15.04下測(cè)試通過,可能存在很多錯(cuò)誤和漏洞.
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");
}
//刪除一個(gè)結(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("沒有找到想要?jiǎng)h除的數(shù)據(jù)\n");
return head;
}
//插入一個(gè)結(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)容了,希望對(duì)大家更加熟悉C語言雙向鏈表能夠有所幫助。
相關(guān)文章
C++將二叉樹轉(zhuǎn)為雙向鏈表及判斷兩個(gè)鏈表是否相交
這篇文章主要介紹了C++將二叉樹轉(zhuǎn)為雙向鏈表及判斷兩個(gè)鏈表是否相交的方法,文中還給出了求兩個(gè)鏈表相交的第一個(gè)節(jié)點(diǎn)列的實(shí)現(xiàn)方法,需要的朋友可以參考下2016-02-02
C++實(shí)現(xiàn)LeetCode(84.直方圖中最大的矩形)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(84.直方圖中最大的矩形),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C++實(shí)現(xiàn)將圖片轉(zhuǎn)換為馬賽克效果的示例代碼
這篇文章主要為大家詳細(xì)介紹了C++如何實(shí)現(xiàn)將圖片轉(zhuǎn)換為馬賽克效果,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下2023-01-01
VSCode 配置C++開發(fā)環(huán)境的方法步驟
這篇文章主要介紹了VSCode 配置C++開發(fā)環(huán)境的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
C語言中操作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

