C语言实现-双链表练习
生活随笔
收集整理的這篇文章主要介紹了
C语言实现-双链表练习
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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 }
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 }
轉載于:https://www.cnblogs.com/Akagi201/archive/2012/03/22/2411054.html
總結
以上是生活随笔為你收集整理的C语言实现-双链表练习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于silverlight+MVVM+W
- 下一篇: 快排函数的使用语法