C语言实现链表的插入、删除、查找运算
1 /* 2 *实现链表的插入、删除、查找运算 3 */ 4 #include <stdio.h> 5 #include <stdlib.h> 6 #include <malloc.h> 7 8 #define flag 0 9 typedef int ElemType; 10 11 typedef struct Lnode //链式存储结构定义 12 { 13 int data; //定义数据域 14 struct Lnode *next; //定义指针域 15 }Lnode,*LinkList; //定义结点和头指针类型名 16 17 Lnode *Get_LinkList(LinkList L,int i) 18 { //在带头结点单链表中查找第i个数据元素,找到返回其指针,否则返回空 19 Lnode *p = L; 20 int j=0; 21 while(p != NULL && j < i) 22 { 23 p = p->next; 24 j++; 25 } 26 return p; 27 } 28 29 int Locate_LinkList(LinkList L,int x) 30 { //在带头结点单链表中查找值等于给定值的结点 31 LinkList p; 32 int j = 1; 33 p = L->next; 34 while (p != NULL && p->data != x) 35 { //若首结点不是查找结点且可以链接刀下一结点 36 p = p->next; 37 j++; 38 } 39 if(p) 40 { 41 printf("%d在链表中,是第%d个元素。\n",p->data,j); 42 return j; 43 } 44 else 45 { 46 printf("该数值不在链表中。\n"); 47 return 0; 48 } 49 } 50 51 int Insert_LinkList(LinkList &L, int i, int x) 52 { //在带头结点单链表的第i个位置之后插入值为x的元素 53 Lnode *p,*s; 54 p = Get_LinkList(L,i); //查找第i个元素 55 if (p == NULL) 56 { 57 printf("参数i输入有误\n"); 58 return 0; 59 } 60 else 61 { 62 s = (Lnode *)malloc(sizeof(Lnode)); //申请、填充结点 63 s->data = x; 64 s->next = p->next; //新结点插入在第i个结点的后面 65 p->next = s; 66 return 1; 67 } 68 } 69 70 int Delete_LinkList(LinkList L,int i) 71 { //删除带头结点单链表上的第i个数据结点 72 LinkList p,s; 73 p = Get_LinkList(L,i-1); //查找第i-1个结点 74 if (p == NULL) 75 { 76 printf("待删除结点前结点不存在!\n"); 77 return -1; 78 } 79 else if (p->next == NULL) 80 { 81 printf("该节点不存在!\n"); 82 return 0; 83 } 84 else 85 { 86 s = p->next; //s指向第i个结点 87 p->next = s->next; //从链表中删除 88 free(s); //释放s 89 return 1; 90 } 91 } 92 93 void Create_LinkList(LinkList &L, int n) 94 { //前插法创建带头结点单链表 95 int i; 96 LinkList p; 97 L = (LinkList)malloc(sizeof(Lnode)); 98 L->next = NULL; //生成头结点 99 for (i = n; i > 0; --i) 100 { 101 p = (LinkList)malloc(sizeof(Lnode)); //生成新结点 102 p->data = i; //填充数据 103 p->next = L->next; //将*p插入原开始结点之前,头结点之后 104 L->next = p; 105 } 106 } 107 108 void Display_LinkList(LinkList L) 109 { 110 LinkList p; 111 p = L; 112 while(p->next) 113 { 114 printf("%d ",p->next->data); 115 p = p->next; 116 } 117 } 118 119 int main() 120 { 121 printf("初始化\n建立单链表如下: \n"); 122 LinkList L; 123 int x,y,cord,i; 124 Create_LinkList(L,10); 125 Display_LinkList(L); 126 do 127 { 128 printf("\n 主菜单 \n"); 129 printf("\n 1 尾插法插入元素到指定位置 \n"); 130 printf("\n 2 删除某一指定元素 \n"); 131 printf("\n 3 查找指定元素 \n"); 132 printf("\n 0 结束程序 \n"); 133 printf("----------------------------------------------\n"); 134 printf("请输入你选择的菜单号<1,2,3,0>: "); 135 scanf("%d",&cord); 136 switch(cord) 137 { 138 case 1: 139 printf("请输入插入元素位置前序号 i: "); 140 scanf("%d",&x); 141 printf("请输入插入的数据 y: "); 142 scanf("%d",&y); 143 Insert_LinkList(L,x,y); //在第i个结点后插入 144 printf("单链表输出如下:\n"); 145 Display_LinkList(L); 146 break; 147 case 2: 148 printf("请输入删除元素序号 x: "); 149 scanf("%d",&x); 150 Delete_LinkList(L,x); 151 printf("单链表输出如下:\n"); 152 Display_LinkList(L); 153 break; 154 case 3: 155 printf("请输入查找元素值x :"); 156 scanf("%d",&x); 157 i = Locate_LinkList(L,x); 158 break; 159 case 0: 160 exit(0); 161 break; 162 default: 163 printf("输入有误!"); 164 } 165 } 166 while(cord <= 3 && cord >= 0); 167 }
运行结果截图