http://hncu.acmclub.com/index.php?app=problem_title&id=111&problem_id=1326
3 3 2 1 21 show delete 1 show delete 2 show delete 1 show delete 2 insert 2 5 show insert 1 5 show insert 1 7 show insert 2 5 show insert 3 6 show insert 1 8 show get 2
1 2 3 delete OK 2 3 delete OK 2 delete OK Link list is empty delete fail insert fail Link list is empty insert OK 5 insert OK 7 5 insert OK 7 5 5 insert OK 7 5 6 5 insert OK 8 7 5 6 5 7
#include<stdio.h> #include<stdlib.h> #include<string.h> #define N 100 #define OK 1 #define ERROR 0 typedef int ElemType; typedef int Status; typedef struct LNode{ ElemType data; struct LNode *next; }LNode,*LinkList; Status ListEmpty(LinkList l) {//判断是否为空 if(!(l->next)) return OK; return ERROR; } Status GetElem(LinkList l,int n,int *e) {//查找第n个结点的数 LinkList p = l->next ; int j = 1; while(p&&j < n) { p = p->next ; j++; } if(!p||j > n) return ERROR; *e = p->data ; return OK; } Status ListDelete(LinkList l,int n,int *e) {//删除第n个结点 LinkList p = l,q; int j = 0; q = (LinkList)malloc(sizeof(LNode)); while(p&&j < n-1) { p = p->next ; j++; } if(!p||j > n-1) return ERROR; q = p->next ; p->next = q->next ; *e = q->data ; free(q); return OK; } Status ListInsert(LinkList l,int n,int e) {//在第n个结点出插入e LinkList p = l,s; int j = 0; while(p&&j < n-1) { p = p->next ; j++; } if( j > n-1||!p) return ERROR; s = (LinkList)malloc(sizeof(LNode)); s->data = e; s->next = p->next ; p->next = s; return OK; } void Insert(LinkList l,int e) {//头插法 LinkList s; s = (LinkList)malloc(sizeof(LNode)); s->data = e; s->next = l->next; l->next = s; } void PrintList(LinkList l) {//输出 单链表l LinkList p = l->next; while(p) { printf("%d ",p->data ); p = p->next ; } printf("\n"); } int main() { int n,i,m,a,e; int num[N+10]; LinkList l; char str[N+10]; scanf("%d",&n); l = (LinkList)malloc(sizeof(LNode)); l->next = NULL; for( i = 1; i <= n; i ++) { scanf("%d",&num[i]); Insert(l,num[i]); } scanf("%d",&m); getchar(); while(scanf("%s",str)!=EOF) { if(!strcmp(str,"get"))//查找 { scanf("%d",&a); if(GetElem(l,a,&e)) printf("%d\n",e); else printf("get fail\n"); } if(!strcmp(str,"delete"))//删除 { scanf("%d",&a); if(ListDelete(l,a,&e)) printf("delete OK\n"); else printf("delete fail\n"); } if(!strcmp(str,"insert"))//插入 { scanf("%d%d",&a,&e); if(ListInsert(l,a,e)) printf("insert OK\n"); else printf("insert fail\n"); } if(!strcmp(str,"show"))//输出 { if(ListEmpty(l)) { printf("Link list is empty\n"); } else PrintList(l); } getchar(); } return 0; }
样例输入 3 2 3 2 1 5 4 样例输出
新建链表la 1 2 3 新建链表lb 4 5 删除链表la的第m个元素 1 3 在链表la的第m个位置插入n 1 3 3 find success 合并la和lb 1 3 3 4 5
#include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0; typedef int ElemType; typedef int Status; //---------线性表的单链表存储结构-------- typedef struct LNode{ ElemType data; struct LNode *next; }LNode,*LinkList; Status GetElem_L(LinkList l,int i)//算法2.8 {//L为带头结点的单链表的头指针 //当第i个元素存在时,其值赋值给e并返回OK,否则返回ERROR LinkList p = l->next ; ElemType e,j; for(j = 1; j < i&&p; j ++)//循环条件为p->next和p的区别 p = p->next ; e = p->data ; if(!p) return ERROR; return OK; } Status ListInsert_L(LinkList l,int i,ElemType e)//算法2.9 {//带头结点的单链线性表L中第i个位置之前插入元素e LinkList p = l->next ,q; ElemType j; for(j = 1; j < i-1; j ++) p = p->next ; q->data = e; q->next = p->next ; p->next= q; return OK; } Status ListDelete_L(LinkList l,int i)//算法2.10 {//带头结点的单链线性表L中,删除第i个元素,并由e返回其值 LinkList p = l->next ,q; ElemType e,j; for( j = 1; j < i-1; j ++) p = p->next ; q = p->next ; e = q->data; p->next = q->next ; return e; } LinkList CreatList_L(LinkList l,int n)//算法2.11 {//逆位序输入n个元素的值,建立带表头结点的单链线性表L LinkList p; int i; l = (LinkList)malloc(sizeof(LNode)); l->next = NULL;//先建立一个带头节点的单链表 for( i = n; i >= 1; i --) { p = (LinkList)malloc(sizeof(LNode));//生成新节点 scanf("%d",&(p->data));//输入元素值 p->next = l->next ;//插入到表头 l->next = p; } return l; } void PrintList_L(LinkList l) { LinkList p = l->next ; while(p) { printf("%d ",p->data ); p = p->next ; } printf("\n"); } void MergeList_L(LinkList la,LinkList lb)//算法2.12 {//归并la和lb的元素得到新的单链表lc,lc的元素也按值非递减排列 //已知单链线性表la和lb的元素按值非递减排列 LinkList pa = la->next ,pb = lb->next,lc,pc; lc = pc = la; while(pa&&pb) { if(pa->data <= pb->data ) { pc->next = pa; pc = pa; pa = pa->next ; } else { pc->next = pb; pc = pb; pb = pb->next ; } } pc->next = pa?pa:pb; PrintList_L(lc); free(lb); } int main() { int n,m; LinkList la,lb,lc; while(scanf("%d%d",&n,&m)!=EOF) { la = CreatList_L(la,n); lb= CreatList_L(lb,m); printf("新建链表la\n"); PrintList_L(la);//调用一次函数,输出查看结果 printf("新建链表lb\n"); PrintList_L(lb);//调用一次函数,输出查看结果 ListDelete_L(la,m); printf("删除链表la的第m个元素\n"); PrintList_L(la);//调用一次函数,输出查看结果 ListInsert_L(la,m,n); printf("在链表la的第m个位置插入n\n"); PrintList_L(la);//调用一次函数,输出查看结果 if(GetElem_L(la,m)) printf("find success\n"); printf("合并la和lb\n"); MergeList_L(la,lb); } return 0; }