赞
踩
Description
编写算法,创建一个含有n个元素的带头结点的单链表L并实现插入、删除、遍历操作。本题目提供部分代码,请补全内容。
#include<stdio.h> #include<malloc.h> #define ERROR 0 #define OK 1 #define ElemType int typedef struct LNode { int data; struct LNode *next; }LNode,*LinkList; int CreateLink_L(LinkList &L,int n){ // 创建含有n个元素的单链表 LinkList p,q; int i; ElemType e; L = new LNode; L->next = NULL; // 先建立一个带头结点的单链表 q = new LNode; q = L; for (i=0; i<n; i++) { scanf("%d", &e); p = new LNode; // 生成新结点 // 请补全代码 } return OK; } int LoadLink_L(LinkList &L){ // 单链表遍历 LinkList p = L->next; if(___________________________)printf("The List is empty!"); // 请填空 else { printf("The LinkList is:"); while(___________________________) // 请填空 { printf("%d ",p->data); ___________________________ // 请填空 } } printf("\n"); return OK; } int LinkInsert_L(LinkList &L,int i,ElemType e){ // 算法2.9 // 在带头结点的单链线性表L中第i个位置之前插入元素e // 请补全代码 } int LinkDelete_L(LinkList &L,int i, ElemType &e){ // 算法2.10 // 在带头结点的单链线性表L中,删除第i个元素,并用e返回其值 // 请补全代码 } int main() { LinkList T; int a,n,i; ElemType x, e; printf("Please input the init size of the linklist:\n"); scanf("%d",&n); printf("Please input the %d element of the linklist:\n", n); if(___________________________) // 判断链表是否创建成功,请填空 { printf("A Link List Has Created.\n"); LoadLink_L(T); } while(1) { printf("1:Insert element\n2:Delete element\n3:Load all elements\n0:Exit\nPlease choose:\n"); scanf("%d",&a); switch(a) { case 1: scanf("%d%d",&i,&x); if(___________________________) printf("Insert Error!\n"); // 判断i值是否合法,请填空 else printf("The Element %d is Successfully Inserted!\n", x); break; case 2: scanf("%d",&i); if(___________________________) printf("Delete Error!\n"); // 判断i值是否合法,请填空 else printf("The Element %d is Successfully Deleted!\n", e); break; case 3: LoadLink_L(T); break; case 0: return 1; } } }
输入格式
测试样例格式说明:
根据菜单操作:
1、输入1,表示要实现插入操作,紧跟着要输入插入的位置和元素,用空格分开
2、输入2,表示要实现删除操作,紧跟着要输入删除的位置
3、输入3,表示要输出顺序表的所有元素
4、输入0,表示程序结束
输入样例
3
3 6 9
3
1
4 12
2
1
3
0
输出样例
Please input the init size of the linklist:
Please input the 3 element of the linklist:
A Link List Has Created.
The LinkList is:3 6 9
1:Insert element
2:Delete element
3:Load all elements
0:Exit
Please choose:
The LinkList is:3 6 9
1:Insert element
2:Delete element
3:Load all elements
0:Exit
Please choose:
The Element 12 is Successfully Inserted!
1:Insert element
2:Delete element
3:Load all elements
0:Exit
Please choose:
The Element 3 is Successfully Deleted!
1:Insert element
2:Delete element
3:Load all elements
0:Exit
Please choose:
The LinkList is:6 9 12
1:Insert element
2:Delete element
3:Load all elements
0:Exit
Please choose:
#include<stdio.h> #include<malloc.h> #define ERROR 0 #define OK 1 #define ElemType int typedef struct LNode { int data; struct LNode *next; }LNode,*LinkList; int CreateLink_L(LinkList &L,int n){ // 创建含有n个元素的单链表 LinkList p,q; int i; ElemType e; L = new LNode; L->next = NULL; q= new LNode; // 先建立一个带头结点的单链表 q = L; for (i=0; i<n; i++) { scanf("%d", &e); p = new LNode; // 生成新结点 p->data=e; p->next=NULL; q->next=p; q=p; } return OK; } int LoadLink_L(LinkList &L){ // 单链表遍历 LinkList p = L->next; if(!p) printf("The List is empty!"); // 请填空 else { printf("The LinkList is:"); while(p) // 请填空 { printf("%d ",p->data); p=p->next; // 请填空 } } printf("\n"); return OK; } int LinkInsert_L(LinkList &L,int i,ElemType e){ int j; LNode *p,*s; p=L; j=0; while(p&&(j<i-1)) { p=p->next; j++; } if(!p||j>i-1) return ERROR; s=new LNode; s->data=e; s->next=p->next; p->next=s; return OK; } int LinkDelete_L(LinkList &L,int i, ElemType &e){ // 算法2.10 // 在带头结点的单链线性表L中,删除第i个元素,并用e返回其值 int j;LNode *p,*q; p=L;j=0; while((p->next)&&(j<i-1)) { p=p->next; j++; } if(!(p->next)||(j>i-1)) return ERROR; q=p->next; p->next=q->next; e=q->data; delete q; return OK; } int main() { LinkList T; int a,n,i; ElemType x, e; printf("Please input the init size of the linklist:\n"); scanf("%d",&n); printf("Please input the %d element of the linklist:\n", n); if(CreateLink_L(T,n))// 判断链表是否创建成功,请填空 { printf("A Link List Has Created.\n"); LoadLink_L(T); } while(1) { printf("1:Insert element\n2:Delete element\n3:Load all elements\n0:Exit\nPlease choose:\n"); scanf("%d",&a); switch(a) { case 1: scanf("%d%d",&i,&x); if(LinkInsert_L(T,i,x)==0) printf("Insert Error!\n"); // 判断i值是否合法,请填空 else printf("The Element %d is Successfully Inserted!\n", x); break; case 2: scanf("%d",&i); if(LinkDelete_L(T,i,e)==0) printf("Delete Error!\n"); // 判断i值是否合法,请填空 else printf("The Element %d is Successfully Deleted!\n", e); break; case 3: LoadLink_L(T); break; case 0: return 1; } } }
创建含有n个元素的单链表(create)
//后插法
p->data=e;
p->next=NULL;
q->next=p;
q=p;
单链表遍历(load)
if(!p)//判断单链表是否为空
while(p)//若指针非空,开始循环
p=p->next;//指针往后移
在带头结点的单链线性表中第i个位置之前插入元素e(insert)
int j; LNode *p,*s; p=L; j=0;//记得初始化j=0 while(p&&(j<i-1))//注意因为能插入到最后一个结点的下一个,所以此处是p /*循环查找第i-1个结点,p指向该结点*/ { p=p->next; j++; } if(!p||j>i-1)//当p为空,或者i不在合法范围内时 return ERROR; s=new LNode;//生成新结点*s s->data=e; s->next=p->next;//结点*s的指针域指向第i个节点,即将变为第i+1个结点 p->next=s;//结点*p,即第i-1个结点,p指向s,结点*s也就变成了第i个结点 return OK;//记得返回OK
在带头结点的单链线性表L中,删除第i个元素,并用e返回其值(delete)
int j; LNode *p,*q; p=L;j=0; while((p->next)&&(j<i-1))//注意因为只能删除到最后一个结点,所以此处是p->next /*查找第i-1个结点,p指向该结点*/ { p=p->next; j++; } if(!(p->next)||(j>i-1))//当i>n或i<1时,删除位置不合理 return ERROR; q=p->next;//q指向第i个节点,用来保存其地址以便返回其值和删除 p->next=q->next;//第i-1个结点直接指向第i+1个结点 e=q->data;//返回被删结点的值 delete q;//释放删除结点的空间 return OK;//记得返回OK
main函数中的3个if
if(CreateLink_L(T,n))// 判断链表是否创建成功
if(LinkInsert_L(T,i,x)==0)//判断i值是否合法
if(LinkDelete_L(T,i,e)==0)//判断i值是否合法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。