这篇文章是转载自 http://www.cnblogs.com/Akagi201/archive/2012/03/22/2411054.html,要面试没时间了哈哈,我大体看了下几个函数,没能实际验证。
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 typedef int ElemType;
5
6 //定义双链表结点类型
7
8 typedef struct Node{
9 ElemType data;
10 struct Node *prior; //指向前驱结点
11 struct Node *next; //指向后继结点
12 }Node, *DLinkList;
13
14 //双链表的建立,采用尾插法建立双链表
15
16 DLinkList DLinkListCreate(){
17 Node *L,*p,*r;
18 L=(Node *)malloc(sizeof(Node));//申请头结点
19 L->next=NULL;
20 r=L;
21 r->next=NULL; //r 为指向终端结点的指针
22 ElemType x;
23 printf("输入结点啊\n");
24 while(scanf("%d",&x)!=EOF){ //输入双链表元素,建立双链表
25 p=(Node *)malloc(sizeof(Node));
26 p->data=x;
27 p->next=r->next;
28 r->next=p;
29 r=p;
30 }
31 r->next=NULL;
32 return L;
33 }
34
35 //双链表查找,查找元素为x的位置
36
37 int DLinkListFind(DLinkList L,ElemType x){
38 DLinkList p; //p为检索
39 p=L->next;
40 int i=1;
41 while(p!=NULL && p->data != x){
42 ++i;
43 p=p->next;
44 }
45 // for(i=1,p=L->next;p;p=p-next,++i){
46 // if(p->data==x){
47 // break;
48 // }
49 // }
50 if(p==NULL){ //如果没找到返回0
51 return 0;
52 }else{
53 return i; //如果找到返回i
54 }
55 }
56
57 //双链表插入,在双链表的第i个位置插入值为x的元素(在原来第i个位置前)
58
59 DLinkList DLinkListInsert(DLinkList L,int i,ElemType x){
60 DLinkList p,s; //s为要插入的结点
61 p=L->next; //从第一个结点位置开始查找
62 int tempi;
63 for(tempi=1;tempi<i-1;++tempi){
64 p=p->next;
65 }
66 s=(Node *)malloc(sizeof(Node));
67 s->data=x;
68 s->next=p->next;
69 p->next->prior=s;
70 s->prior=p;
71 p->next=s;
72
73 return L;
74 }
75
76 //双链表的删除,删除双链表中第i个结点
77
78 DLinkList DLinkListDelete(DLinkList L,int i){
79 int tempi=1;
80 DLinkList p; //p为查找结点
81 p=L->next;
82 while((tempi++)!=i && p!=NULL){
83 p=p->next;
84 }
85 if(p==NULL){ //检查是否在双链表中的位置
86 printf("位置不合法\n");
87 }else if(p->next == NULL){
88 p->prior->next=NULL;
89 free(p);
90 }else{
91 p->prior->next=p->next;
92 p->next->prior=p->prior;
93 free(p);
94 }
95 }
96 int main(){
97 DLinkList list,start;
98 list=DLinkListCreate();
99 for(start=list->next;start!=NULL;start=start->next){
100 printf("%d ",start->data);
101 }
102 printf("\n");
103 int i;
104 ElemType x;
105 printf("请输入要查找元素的值:");
106 scanf("%d",&x);
107 i = DLinkListFind(list,x);
108 if(i){
109 printf("在链表中的位置为:%d\n",i);
110 }else{
111 printf("没有这个元素。\n");
112 }
113 printf("请输入插入位置:");
114 scanf("%d",&i);
115 printf("请输入插入元素的值:");
116 scanf("%d",&x);
117 DLinkListInsert(list,i,x);
118 for(start=list->next;start!=NULL;start=start->next){
119 printf("%d ",start->data);
120 }
121 printf("\n");
122 printf("请输入要删除的位置:");
123 scanf("%d",&i);
124 DLinkListDelete(list,i);
125 for(start=list->next;start!=NULL;start=start->next){
126 printf("%d ",start->data);
127 }
128 printf("\n");
129 return 0;
130 }