链表上的基本操作实现 (c++)

实验题目(共10题, 第6题)


标题: 链表上的基本操作实现
时 限: 1000 ms
内存限制: 10000 K
总时限: 1000 ms
描述: 在单链表存储结构上实现基本操作:初始化、创建、插入、删除、查找、遍历、逆置、合并运算。
输入: 输入线性表La的长度:n
输入线性表La中的元素:a1 a2 a3 ...an(数值有序,为降序)
输入要插入到线性表La中的元素x和插入的位置i:x i
输入要删除元素的位置:i
输入要查找的元素:x
输入线性表Lb的长度:m
输入线性表Lb中的元素:b1 b2...bm(数值有序,为升序)
输出: 创建好的线性表La=a1 a2...an
插入一个元素后的线性表La=a1 a2...an+1
删除一个元素后的线性表La=a1 a2...an
查找一个输入的元素,如果找到,输出"找到,x在第i个位置";如果没有找到,输出"没找到"的信息。
逆置La后的线性表an an-1...a1
合并La和Lb后的线性表
输入样例: 6
15 13 10 9 8 5
7 6
4
10
4
1 3 6 9
输出样例:

创建好的线性表La=15 13 10 9 8 5
插入一个元素后的线性表La=15 13 10 9 8 7 5
删除一个元素后的线性表La=15 13 10 8 7 5
找到,10在第3个位置
逆置后的线性表La=5 7 8 10 13 15
合并La和Lb后的线性表=1 3 5 6 7 8 9 10 13 15

提示:  
来源:
View Code
  1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<malloc.h>
4
5 typedef int ElemType;
6 typedef struct Lnode
7 {
8 ElemType data;
9 struct Lnode* next;
10 }Lnode,*LinkList;
11
12 LinkList InitLinkList(void);
13 void LinkListInsert(LinkList ,ElemType ,int );
14 void LinkListDelete(LinkList,int i);
15 int LinkListLocate(LinkList,ElemType,int &);
16 void LinkListTraverse(LinkList,void(*visit)(ElemType));
17 void LinkListInverse_set(LinkList &);
18 void LinkListUnion(LinkList,LinkList,int(*compare)(ElemType,ElemType));
19 void Visit(ElemType);
20 int Compare(ElemType,ElemType);
21
22 int main()
23 {
24 int length_a,length_b,i,j,w;
25 ElemType temp,x;
26 LinkList La,Lb;
27 La=InitLinkList();
28 Lb=InitLinkList();
29 //printf("请输入线性表La的长度:\n");
30 scanf("%d",&length_a);
31 // length_a = 1;
32 //printf("请输入线性表La中的元素:\n");
33 for(i=1;i<=length_a;i++)
34 {
35 scanf("%d",&temp);
36 LinkListInsert(La,temp,i);
37 }
38 printf("创建好的线性表La=");
39 LinkListTraverse(La,&Visit);
40 //printf("请输入要插入到线性表La中的元素x和插入的位置i:\n");
41 scanf("%d%d",&x,&i);
42 LinkListInsert(La,x,i);
43 printf("插入一个元素后的线性表La=");
44 LinkListTraverse(La,&Visit);
45 //printf("请输入要删除元素的位置:\n");
46 scanf("%d",&i);
47 LinkListDelete(La,i);
48 printf("删除一个元素后的线性表La=");
49 LinkListTraverse(La,&Visit);
50 //printf("请输入要查找的元素:\n");
51 scanf("%d",&x);
52 if(!LinkListLocate(La,x,w))
53 printf("没找到\n");
54 else
55 printf("找到,%d在第%d个位置\n",x,w);
56 LinkListInverse_set(La);
57 printf("逆置后的线性表La=");
58 LinkListTraverse(La,&Visit);
59 //printf("请输入线性表Lb的长度:\n");
60 scanf("%d",&length_b);
61 //printf("请输入线性表Lb中的元素:\n");
62 for(j=1;j<=length_b;j++)
63 {
64 scanf("%d",&temp);
65 LinkListInsert(Lb,temp,j);
66 }
67 LinkListUnion(La,Lb,&Compare);
68 printf("合并La和Lb后的线性表=");
69 LinkListTraverse(La,&Visit);
70
71 return 0;
72 }
73 LinkList InitLinkList(void)
74 {
75 LinkList p;
76 p=(LinkList)malloc(sizeof(Lnode));
77 p->next=NULL;
78 return p;
79 }
80 void LinkListInsert(LinkList L,ElemType e,int i)
81 {
82 if(i<=0)
83 {
84 printf("error\n");
85 exit(0);
86 }
87 LinkList p=L,q=NULL;
88 int j=0;
89 while(p&&j<i-1)
90 {
91 p=p->next;
92 j++;
93 }
94 if(!p)
95 {
96 printf("error\n");
97 exit(0);
98 }
99 q=(LinkList)malloc(sizeof(Lnode));
100 q->data=e;
101 q->next=p->next;
102 p->next=q;
103 }
104 void LinkListDelete(LinkList L,int i)
105 {
106 if(i<=0)
107 {
108 printf("error\n");
109 exit(0);
110 }
111 int j;
112 LinkList p,q;
113 p=L;
114 for(j=0;p->next&&j<i-1;j++)
115 p=p->next;
116 if(!(p->next))
117 {
118 printf("error\n");
119 exit(0);
120 }
121 q=p->next;
122 p->next=p->next->next;
123 free(q);
124 }
125 int LinkListLocate(LinkList L,ElemType e,int &w)
126 {
127 int i=1;
128 LinkList p=L->next;
129 while(p&&p->data!=e)
130 {
131 p=p->next;
132 i++;
133 }
134 if(!p)
135 return 0;
136 else
137 {
138 w=i;
139 return 1;
140 }
141 }
142 void LinkListTraverse(LinkList L,void(*visit)(ElemType))
143 {
144 LinkList p=L->next;
145 while(p)
146 {
147 visit(p->data);
148 p=p->next;
149 }
150 printf("\n");
151 }
152 void LinkListInverse_set(LinkList &L)
153 {
154 LinkList p,q,ptrtemp;
155 p=L->next;
156 q=p->next;
157 p->next=NULL;
158 while(q)
159 {
160 ptrtemp=q->next;
161 q->next=p;
162 p=q;
163 q=ptrtemp;
164 }
165 L->next=p;
166 //LinkListTraverse(L,&Visit);
167 }
168 void LinkListUnion(LinkList La,LinkList Lb,int(*compare)(ElemType e1,ElemType e2))
169 {
170 LinkList Pa=La->next,Pb=Lb->next,Pc=La;
171 while(Pa&&Pb)
172 {
173 if(compare(Pa->data,Pb->data)<=0)
174 {
175 Pc->next=Pa;
176 Pa=Pa->next;
177 Pc=Pc->next;
178 }
179 else
180 {
181 Pc->next=Pb;
182 Pb=Pb->next;
183 Pc=Pc->next;
184 }
185 }
186 if(Pa)
187 Pc->next=Pa;
188 else
189 Pc->next=Pb;
190 }
191 void Visit(ElemType e)
192 {
193 printf("%d ",e);
194 }
195 int Compare(ElemType e1,ElemType e2)
196 {
197 return e1-e2;
198 }
posted @ 2011-05-24 17:53  itbird  Views(938)  Comments(1Edit  收藏  举报