双链表的初始化,建立,插入,查找,删除-C语言

001    ////////////////////////////////////////////

002    //双链表的初始化,建立,插入,查找,删除。//

003    //Author:Wang Yong //

004    //Date: 2010.8.19 //

005    ////////////////////////////////////////////

006    
007    
008    #include <stdio.h>
009    #include <stdlib.h>
010    
011    typedef int ElemType;
012    ////////////////////////////////////////////

013    
014    // 定义双链表结点类型

015    
016    typedef struct Node
017    {
018     ElemType data;
019     struct Node *prior; //指向前驱结点

020     struct Node *next; //指向后继结点

021    }Node, *DLinkList;
022    
023    ////////////////////////////////////////////

024    
025    //双链表的建立,采用尾插法建立双链表

026    DLinkList DLinkListCreatT()
027    {
028     Node *L,*p,*r;
029     L = (Node *)malloc(sizeof(Node));//申请头结点

030     L->next = NULL;
031     r = L;
032     r->next = NULL; //r 为指向终端结点的指针

033     ElemType x;
034     while(scanf("%d",&x) != EOF) //输入双链表元素,建立双链表

035     {
036     p = (Node *)malloc(sizeof(Node));
037     p->data = x;
038     p->next = r->next;
039     r->next = p;
040     r = p;
041     }
042     r->next = NULL;
043     return L;
044    }
045    
046    /////////////////////////////////////////

047    
048    //双链表的查找,查找元素为x的位置

049    
050    int DLinkListFind(DLinkList L,ElemType x)
051    {
052     DLinkList p; //p为检索,

053     p = L->next;
054     int i = 1;
055     while(p != NULL && p->data != x )//寻找值为x的元素**注意这里循环的条件不能写反

056     { //原因,当p == NULL 时候 p->data 会出错

057     ++i; // for (i = 1, p = L->next; p; p = p->next, i++) {

058     // if (p->data == x) break;}

059     p = p->next;
060     }
061    
062     if(p == NULL) //如果没找到返回0

063     return 0;
064     else return i; //如果找到返回i

065    }
066    /////////////////////////////////////////

067    
068    //双链表的插入,在双链表中的第i个位置插入值为x的元素

069    
070    DLinkList DLinkListInsert(DLinkList L,int i,ElemType x)
071    {
072     DLinkList p,s; //s为要插入的结点

073     p = L->next; //从第一个结点位置开始查找

074     int tempi;
075     for(tempi = 1;tempi < i-1; tempi++)
076     p = p->next;
077     s = (Node *)malloc(sizeof(Node));
078     s->data = x; //将x赋值到s的数据域

079     s->next = p->next; //将结点插入

080     p->next->prior = s;
081     s->prior = p;
082     p->next = s;
083    
084     return L;
085    
086    }
087    
088    //////////////////////////////////////////////

089    
090    //双链表的删除,删除双链表中第i个结点

091    
092    DLinkList DLinkListDelete(DLinkList L,int i)
093    {
094     int tempi = 1;
095     DLinkList p; //p为查找结点。

096     p = L->next;
097     while((tempi++) != i && p != NULL)
098     {
099     p = p->next;
100     }
101     if(p == NULL) //检查是不是在双链表中的位置

102     printf("位置不合法。\n");
103     else if(p->next == NULL) //最后一个结点特殊处理,原因最后一个结点p->next没有prior

104     {
105     p->prior->next = NULL;
106     free(p);
107     }
108     else //进行删除操作

109     {
110     p->prior->next = p->next;
111     p->next->prior = p->prior;
112     free(p);
113     }
114    }
115    
116    ///////////////////////////////////////////

117    int main()
118    {
119     DLinkList list,start;
120     list = DLinkListCreatT();
121     for(start = list->next; start != NULL; start = start->next)
122     printf("%d ",start->data);
123     printf("\n");
124     int i;
125     ElemType x;
126     printf("请输入要查找元素的值:");
127     scanf("%d",&x);
128     i = DLinkListFind(list,x);
129     if(i)
130     printf("在链表中的位置为:%d\n",i);
131     else
132     printf("没有这个元素。\n");
133     printf("请输入插入位置:");
134     scanf("%d",&i);
135     printf("请输入插入元素的值:");
136     scanf("%d",&x);
137     DLinkListInsert(list,i,x);
138     for(start = list->next; start != NULL; start = start->next)
139     printf("%d ",start->data);
140     printf("\n");
141     printf("请输入要删除的位置:");
142     scanf("%d",&i);
143     DLinkListDelete(list,i);
144     for(start = list->next; start != NULL; start = start->next)
145     printf("%d ",start->data);
146     printf("\n");
147    
148     return 0;
149    }


作者: dongliqiang1985   发布时间: 2010-12-17