1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<math.h> 4 5 typedef int DataType; 6 typedef struct node{ //结点类型定义 7 DataType data; //结点的数据域 8 struct node *next; //结点的指针域 9 }ListNode,*LinkList; 10 ListNode *p; 11 LinkList head; 12 /*注意:定义结点结构时,有几点需要注意: 13 LinkList和ListNode *是不同名字的同一个指针类型, 14 LinkList类型的指针变量head表示他是单链表的头指针, 15 ListNode *类型的指针变量p表示它是指向某一结点的指针*/ 16 LinkList InitList() 17 { 18 LinkList L; 19 L=(ListNode*)malloc(sizeof(ListNode)); 20 if(L==NULL) 21 { 22 printf("分配空间失败!"); 23 exit(1); 24 } 25 L->next=NULL; 26 return L; 27 } 28 29 /*头插法建立单链表*/ 30 LinkList CreatListF() 31 { 32 DataType x; 33 LinkList L; 34 ListNode *s; 35 L=(ListNode *)malloc(sizeof(ListNode)); //头结点 36 if(L==NULL) //检查L是否分配到储存空间 37 { 38 printf("分配空间失败!"); 39 exit(1); 40 } 41 L->next=NULL; 42 scanf("%d",&x); 43 while(x!=0) 44 { 45 s=(ListNode *)malloc(sizeof(ListNode)); //为新插入的结点申请空间 46 if(s==NULL) 47 { 48 printf("分配空间失败!"); 49 exit(1); 50 } 51 s->data=x; 52 s->next=L->next; 53 L->next=s; 54 scanf("%d",&x); 55 } 56 return L; 57 } 58 59 60 /*尾插法建立单链表*/ 61 LinkList CreatListL() 62 { 63 DataType x; 64 LinkList L=(ListNode *)malloc(sizeof(ListNode)); //头结点 65 if(L==NULL) 66 { 67 printf("分配空间失败!"); 68 exit(1); 69 } 70 ListNode *s,*r; 71 r=L; 72 scanf("%d",&x); 73 while(x!=0) //以0输入表示结束 74 { 75 s=(ListNode *)malloc(sizeof(ListNode)); //为新插入的结点申请空间 76 if(s==NULL) 77 { 78 printf("分配空间失败!"); 79 exit(1); 80 } 81 s->data=x; 82 r->next=s; 83 r=s; 84 scanf("%d",&x); 85 } 86 r->next=NULL; //单链表的最后一个指针为空 87 return L; 88 } 89 90 //获取链表长度 91 int GetLength(LinkList L) 92 { 93 int num=0; 94 ListNode *p; 95 p=L->next; 96 while(p!=NULL) 97 { 98 num++; 99 p=p->next; 100 } 101 return(num); 102 } 103 104 //查找第i位元素 105 ListNode *GetNode(LinkList L,int i) 106 { 107 int j=1; 108 ListNode *p; 109 if(i<1||i>GetLength(L)) 110 { 111 printf("查找的位置不正确!"); 112 exit(1); 113 } 114 p=L->next; 115 while(p!=NULL&&j<i) 116 { 117 p=p->next; 118 j++; 119 } 120 return p; 121 } 122 123 //查找元素x 124 int LocateListi(LinkList L,DataType x) 125 { 126 ListNode *p=L->next; 127 int i=1; 128 while(p!=NULL&&p->data!=x) 129 { 130 p=p->next; 131 i++; 132 } 133 if(p==NULL) 134 return 0; 135 else 136 return i; 137 } 138 139 //在第i位插入元素x 140 void InsertList(LinkList L,DataType x,int i) 141 { 142 ListNode *p,*q,*s; 143 int j=1; 144 p=L; 145 if(i<1||i>GetLength(L)+1) 146 { 147 printf("插入位置不正确!"); 148 exit(1); 149 } 150 s=(ListNode *)malloc(sizeof(ListNode)); 151 if(s==NULL) 152 { 153 printf("分配空间失败!"); 154 exit(1); 155 } 156 s->data=x; 157 while(j<=i) 158 { 159 q=p; 160 p=p->next; 161 j++; 162 } 163 s->next=p; 164 q->next=s; 165 } 166 167 //删除第i位元素 168 void DeleteList(LinkList L,int i) 169 { 170 ListNode *p,*q; 171 int j=1; 172 p=L; 173 if(i<1||i>GetLength(L)) 174 { 175 printf("删除位置不正确!"); 176 exit(1); 177 } 178 while(j<i) 179 { 180 p=p->next; 181 j++; 182 } 183 q=p->next; 184 p->next=q->next; 185 free(q); 186 } 187 188 //打印链表 189 void PrintList(LinkList L) 190 { 191 ListNode *p; 192 p=L->next; 193 printf("链表元素如下:\n"); 194 while(p!=NULL) 195 { 196 printf("%d ",p->data); 197 p=p->next; 198 } 199 printf("\n"); 200 } 201 int main() 202 { 203 DataType a; 204 head=InitList(); 205 printf("我们将采用头插法创建一个单链表L!\n请输入您要输入的数据(以空格隔开,以0结束!)\n"); 206 head=CreatListF(); 207 printf("单链表的长度为:%d\n",GetLength(head)); 208 printf("请输入您要查找元素的结点序号:"); 209 scanf("%d",&a); 210 printf("第%d个元素为:%d\n",a,GetNode(head,a)->data); 211 printf("请输入您要查找的元素:"); 212 scanf("%d",&a); 213 printf("您查找的元素%d在链表中的第%d个位置\n",a,LocateListi(head,a)); 214 int x,i; 215 printf("请输入您要插入元素的数值以及位置:"); 216 scanf("%d%d",&x,&i); 217 InsertList(head,x,i); 218 PrintList(head); 219 printf("请输入您想要删除元素的位置:"); 220 scanf("%d",&i); 221 DeleteList(head,i); 222 PrintList(head); 223 return 0; 224 }