第2章 线性表的链式表示
综合应用题 第1题
#include <stdio.h>
#include <stdlib.h> //malloc所在头文件
#include <iostream>
using namespace std;
typedef int ElemType;
typedef struct node {
ElemType data; //单链表中的数据域
struct node *next; //单链表的指针域
}LNode, *LinkList;
//不带头结点单链表的初始化
bool InitList(LinkList &L){
L=NULL;
return true;
}
//单链表的建立1,头插法建立不带头结点的单链表
LinkList LinkListCreatH(ElemType *a,int n,LinkList &L) {
InitList(L); //初始化一个空链表
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
L->data=a[0];
LNode *p;
for (int i = 1; i < n; i++){
p = (LNode *)malloc(sizeof(LNode)); //申请新的结点
if (p == NULL) { //判断是否有足够的内存空间
printf("申请内存空间失败\n");
exit(0);
}
//核心
p->data = a[i]; //结点数据域赋值
p->next = L; //将结点插入到表头L-->|2|-->|1|-->NULL
L=p;
}
return L;
}
//单链表的建立2,尾插法建立不带头结点的单链表
LinkList LinkListCreatT(ElemType *a,int n,LinkList &L) {
InitList(L); //初始化一个空链表
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
L->data=a[0];
LNode *p,*r;
r=L;
for (int i = 1; i < n; i++){
p = (LNode *)malloc(sizeof(LNode)); //申请新的结点
if (p == NULL) { //判断是否有足够的内存空间
printf("申请内存空间失败\n");
exit(0);
}
//核心
p->data = a[i]; //结点数据域赋值
p->next = r->next; //将结点插入到表头L-->|2|-->|1|-->NULL
r->next=p;
r=p;
}
return L;
}
//递归删除
void del_x(LinkList &L,ElemType x){
LNode *p;
if(L==NULL)return;
if(L->data==x)
{
p=L;
L=L->next;
delete p;
del_x(L,x);
}
else
del_x(L->next,x);
}
int main() {
LinkList list, start;//, listverse;
int array[8] = { 1, 2, 4, 3, 5, 6, 7, 8 };
cout<<"输出单链表的数据:";
LinkListCreatH(array,8,list);
for (start = list; start != NULL; start = start->next) {
cout<<start->data<<" ";
}
cout<<endl;
ElemType x;
cout<<"请输入要删除的元素的值:";
cin>>x;
del_x(list,x);
for (start = list; start != NULL; start = start->next) {
cout<<start->data<<" ";
}
cout<<endl;
return 0;
}
头插法
尾插法