雙向鏈表的基本運算 --線性表
阿新 • • 發佈:2017-10-18
image lib 前驅 col 查找 data 插入 let 指定位置
C語言實現雙向鏈表的插入、刪除、查找運算
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <malloc.h> 4 5 typedef int ElemType; 6 typedef struct DLnode 7 { 8 ElemType data; //定義數據域 9 struct DLnode *prior; //定義前驅結點 10 struct DLnode *next; //定義後繼結點11 }DLnode,*DLinkList; //定義結點和頭指針類型名 12 13 void Init_DLinkList(DLinkList &L) 14 { //初始化鏈表 15 L = (DLnode *)malloc(sizeof(DLnode)); //生成頭結點 16 L->prior = L->next = NULL; //初始化頭、尾結點 17 } 18 19 void Create_DLinkList(DLinkList &L,intn) 20 { //前插法創建雙向鏈表 21 int i; 22 DLinkList p; 23 L = (DLinkList)malloc(sizeof(DLnode)); 24 L->next = NULL; //生成頭結點 25 L->prior = NULL; 26 for (i = n; i > 0; --i) 27 { 28 p = (DLinkList)malloc(sizeof(DLnode)); //生成新結點 29p->data = i; //裝填數據 30 p->next =L->next; //將*p插入原開始結點之前,頭結點之後 31 L->next = p; 32 if (p->next != NULL) 33 p->next->prior = p; 34 p->prior = L; 35 } 36 } 37 38 int Locate_DLinkList(DLinkList L,ElemType e) 39 { //在雙向鏈表中查找某個數據元素 40 int i = 1; 41 DLinkList p = L->next; 42 while(p != NULL && p->data != e) 43 { 44 i ++; 45 p = p->next; 46 } 47 if (p == NULL) 48 { 49 printf("雙鏈表中不存在該元素!\n"); 50 return 0; 51 } 52 else 53 return i; 54 } 55 56 int Insert_DLinkList(DLinkList &L,int i,ElemType e) 57 { //在第i個數據元素之前插入新元素 58 int j = 0; 59 DLinkList p = L, s; 60 while (p != NULL && j < i) 61 { 62 j ++; 63 p = p->next; 64 } 65 if (p == NULL) //第i個結點不存在 66 { 67 printf("插入位置不正確!\n"); 68 return 0; 69 } 70 else //找到第i個結點*p 71 { 72 s = (DLnode *)malloc(sizeof(DLnode)); //生成新結點*s 73 s->data = e; 74 s->prior = p->prior; //將*s插入到*p之前 75 s->next = p; 76 p->prior->next = s; 77 p->prior = s; 78 return 1; 79 } 80 } 81 82 int Delete_DLinkList(DLinkList &L,int i,ElemType &e) 83 { //刪除鏈表中第i個數據元素 84 int j = 0; 85 DLinkList p = L; 86 while(j < i && p != NULL) 87 { 88 j ++; 89 p = p->next; 90 } 91 if (p == NULL) 92 { 93 printf("刪除位置不正確!\n"); 94 return 0; 95 } 96 else 97 { 98 e = p->data; 99 p->prior->next = p->next; //刪除*p結點 100 if (p->next != NULL) 101 p->next->prior = p->prior; 102 free(p); 103 return 1; 104 } 105 } 106 107 void Display_DLinkList(DLinkList L) 108 { 109 DLinkList p; 110 p = L->next; 111 while(p) 112 { 113 printf("%d ",p->data); 114 p = p->next; 115 } 116 } 117 118 int main(int argc, char * argv[]) 119 { 120 DLinkList L; 121 int i,j,e,x,t; 122 char ch; 123 Init_DLinkList(L); 124 Create_DLinkList(L,10); 125 printf("初始化\n建立雙向鏈表如下\n"); 126 Display_DLinkList(L); 127 while (i < 10) 128 { 129 printf("\n 主菜單 \n"); 130 printf(" 1 查找指定元素 \n"); 131 printf(" 2 插入元素到指定位置 \n"); 132 printf(" 3 刪除某一指定位置元素 \n"); 133 printf(" 4 退出程序 \n"); 134 printf("----------------------------------------------\n"); 135 printf("請輸入你選擇的單號<1,2,3,4>: "); 136 scanf("%d",&i); 137 switch(i) 138 { 139 case 1: 140 printf("請輸入查找元素: "); 141 scanf("%d",&x); 142 j = Locate_DLinkList(L,x); 143 if (j != 0) 144 printf("指定元素位置 = %d\n",j); 145 break; 146 case 2: 147 printf("請輸入插入元素位置後結點序號: "); 148 scanf("%d",&t); 149 printf("請輸入插入元素值: "); 150 scanf("%d",&x); 151 j = Insert_DLinkList(L,t,x); 152 if (j != 0) 153 { 154 printf("插入後雙向鏈表如下所示:\n"); 155 Display_DLinkList(L); 156 } 157 break; 158 case 3: 159 printf("請輸入刪除元素位置: "); 160 scanf("%d",&t); 161 j = Delete_DLinkList(L,t,e); 162 if (j != 0) 163 { 164 printf("刪除後雙向鏈表如下所示:\n"); 165 Display_DLinkList(L); 166 } 167 break; 168 case 4: 169 exit(0); 170 break; 171 default: 172 printf("輸入有誤!"); 173 } 174 } 175 }
運行結果
雙向鏈表的基本運算 --線性表