1 #include<stdio.h>
2 #include <stdlib.h>
3 #include<malloc.h>
4 #define OK 1
5 #define ERROR 0
6 #define ElemType int
7 typedef int Status;
8 typedef struct LNode
9 {
10 int data;
11 struct LNode *next;
12 }LNode,*LinkList;
13 Status InitList(LinkList &L){
14 L=new LNode;
15 L->next=NULL;
16 return OK;
17 }
18 void CreateList_H(LinkList &L, int n) { //头插法创建链表,最先创建的元素为链表尾
19 L=new LNode;
20 LinkList p;
21 L->next=NULL;
22 for(int i=0;i<n;++i){
23 p=new LNode;
24 scanf("%d",&p->data);
25 p->next=L->next;
26 L->next=p;
27 }
28 }
29 void CreateList_R(LinkList &L, int n) {
30 L=new LNode;
31 LinkList p,r;
32 L->next=NULL;
33 r=L;
34 for(int i=0;i<n;++i){
35 p=new LNode;
36 scanf("%d",&p->data);
37 p->next=NULL;
38 r->next=p;
39 }
40 }
41 Status GetElem(LinkList L,int i,ElemType &e)
42 {
43 LinkList p=L;
44 p=L->next;
45 int j=1;
46 while(p&&j<1)
47 {
48 p=p->next;
49 ++j;
50 }
51 if(!p||j>i) return ERROR;
52 e=p->data;
53 return OK;
54 }
55 LNode *LocateElem(LinkList L,ElemType e)
56 {
57 LinkList p;
58 p=L->next;
59 while(p&&p->data!=e)
60 p=p->next;
61 return p;
62 }
63 Status ListInsert(LinkList &L,int i,ElemType e)
64 {
65 LinkList p,s;
66 p=L;
67 int j=0;
68 while(p&&(j<i-1))
69 {
70 p=p->next;
71 ++j;
72 }
73 if(!p||j>j-1) return ERROR;
74 s=new LNode;
75 s->data=e;
76 s->next=p->next;
77 p->next=s;
78 return OK;
79 }
80 Status ListDelete(LinkList &L,int i)
81 {
82 LinkList p,q;
83 p=L;
84 int j=0;
85 while((p->next)&&(j<i-1))
86 {
87 p=p->next;
88 ++j;
89 }
90 if(!(p->next)||j>i-1) return ERROR;
91 q=p->next;
92 p->next=q->next;
93 delete q;
94 return OK;
95 }
96 void print(LinkList &L)
97 {
98 LinkList p=L->next;
99 while(p)
100 {
101 printf("%d ",p->data);
102 p=p->next;
103 }
104 printf("\n");
105 }
106 int main(){
107 LinkList list;
108 LNode s;
109 int n,m,i;
110 InitList(list);
111 printf(" 1.前插法 2.后插法\n");
112 scanf("%d",&i);
113 if(i==1)
114 {
115 printf("创建链表个数为:");
116 scanf("%d",&n);
117 printf("使用前插法创建链表为:");
118 CreateList_H(list,n);
119 print(list);
120 }
121 if(i==2)
122 {
123 printf("创建链表个数为:");
124 scanf("%d",&n);
125 printf("使用后插法创建链表为:");
126 CreateList_R(list,n);
127 print(list);
128 }
129 ListInsert(list,3,9);
130 printf("在第3个位置插入9后链表为:");
131 print(list);
132 ListDelete(list,1);
133 printf("删除第1个结点后链表为:");
134 print(list);
135 GetElem(list,1,m);
136 printf("查询出第1个值为:%d\n",m);
137 s=*LocateElem(list,3);
138 printf("查询出值为3的结点:%d",s);
139 }