关于线性表的链式存储(链表)的创建,头插法,尾插法,删除链表结点的操作
2014-03-12 23:00
344 查看
本程序在VC环境下运行。
linklist.h文件。
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
#define True 1
#define False 0
typedef struct Node{
ElemType data;
struct Node *next;
}Node,*linklist;
linklist.cpp文件。
#include "linklist.h"
//链表的初始化(含头结点)
int Initlinklist(linklist *L){
(*L)=(linklist)malloc(sizeof(Node));
if((*L)->next!=NULL){
(*L)->next=NULL;
return False;
}else{
return True;
}
}
//向链表中插入元素(头插法)
int inslinklist(linklist *L,int data){
Node *p=(Node *)malloc(sizeof(Node));//为一结点开辟空间并初始化
p->data=data;
p->next=NULL;
//进行插入操作
p->next=(*L)->next;
(*L)->next=p;
return True;
}
//向链表中插入元素(尾插法)
int insrlinklist(linklist *L){
int i,length,data;
Node *r=(*L);
printf("请输入尾插法的链表的长度:");
scanf("%d",&length);
for(i=0;i<length;i++){
printf("请输入第%d个结点的值:",i+1);
scanf("%d",&data);
Node *p=(Node *)malloc(sizeof(Node));//为一结点开辟空间并初始化
p->data=data;
p->next=NULL;
//进行插入操作
r->next=p;
r=p;
printf("\n");
}
return True;
}
//删除链表中的元素
int dellinklist(linklist *L,int data){
Node *pre;//指向删除元素的前一个元素
Node *p=(*L);
Node *q;//用来指向要删除的元素
pre=p;
if((*L)->next==NULL){//链表为空
return False;
}else{
while(p->next!=NULL && p->next->data!=data){
p=p->next;
pre=p;
}
if(pre->next==NULL){//查到最后一个结点且该结点不是要删除的结点
return False;
}else{
q=pre->next;
// (*temp)=q->data;//存储删除的元素
pre->next=q->next;
free(q);
return True;
}
}
}
//显示链表
void Display(linklist L){
Node *p=L->next;
printf("链表的全部数据为:\n");
while(p!=NULL){
printf("%d\t",p->data);
p=p->next;
}
}
void main(){
int length;
int i,j;
int data;
Node *r;//尾指针
linklist L;
Initlinklist(&L);
printf("请输入要插入的结点的长度:");
scanf("%d",&length);
printf("\n");
for(i=0;i<length;i++){
printf("请输入要插入第%d个结点的值:",i+1);
scanf("%d",&data);
inslinklist(&L,data);
printf("\n");
}
Display(L);
printf("\n");
printf("请输入要删除的数据:");
scanf("%d",&data);
j=dellinklist(&L,data);
if(j==False){
printf("链表中没有此结点或者链表为空.");
}else{
Display(L);
}
printf("\n");
printf("关于尾插法插入结点:\n");
Initlinklist(&L);
insrlinklist(&L);
Display(L);
printf("\n");
}
运行结果如下:
请输入要插入的结点的长度:3
请输入要插入第1个结点的值:12
请输入要插入第2个结点的值:13
请输入要插入第3个结点的值:23
链表的全部数据为:
23 13 12
请输入要删除的数据:13
链表的全部数据为:
23 12
关于尾插法插入结点:
请输入尾插法的链表的长度:4
请输入第1个结点的值:12
请输入第2个结点的值:13
请输入第3个结点的值:24
请输入第4个结点的值:35
链表的全部数据为:
12 13 24 35
Press any key to continue
linklist.h文件。
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
#define True 1
#define False 0
typedef struct Node{
ElemType data;
struct Node *next;
}Node,*linklist;
linklist.cpp文件。
#include "linklist.h"
//链表的初始化(含头结点)
int Initlinklist(linklist *L){
(*L)=(linklist)malloc(sizeof(Node));
if((*L)->next!=NULL){
(*L)->next=NULL;
return False;
}else{
return True;
}
}
//向链表中插入元素(头插法)
int inslinklist(linklist *L,int data){
Node *p=(Node *)malloc(sizeof(Node));//为一结点开辟空间并初始化
p->data=data;
p->next=NULL;
//进行插入操作
p->next=(*L)->next;
(*L)->next=p;
return True;
}
//向链表中插入元素(尾插法)
int insrlinklist(linklist *L){
int i,length,data;
Node *r=(*L);
printf("请输入尾插法的链表的长度:");
scanf("%d",&length);
for(i=0;i<length;i++){
printf("请输入第%d个结点的值:",i+1);
scanf("%d",&data);
Node *p=(Node *)malloc(sizeof(Node));//为一结点开辟空间并初始化
p->data=data;
p->next=NULL;
//进行插入操作
r->next=p;
r=p;
printf("\n");
}
return True;
}
//删除链表中的元素
int dellinklist(linklist *L,int data){
Node *pre;//指向删除元素的前一个元素
Node *p=(*L);
Node *q;//用来指向要删除的元素
pre=p;
if((*L)->next==NULL){//链表为空
return False;
}else{
while(p->next!=NULL && p->next->data!=data){
p=p->next;
pre=p;
}
if(pre->next==NULL){//查到最后一个结点且该结点不是要删除的结点
return False;
}else{
q=pre->next;
// (*temp)=q->data;//存储删除的元素
pre->next=q->next;
free(q);
return True;
}
}
}
//显示链表
void Display(linklist L){
Node *p=L->next;
printf("链表的全部数据为:\n");
while(p!=NULL){
printf("%d\t",p->data);
p=p->next;
}
}
void main(){
int length;
int i,j;
int data;
Node *r;//尾指针
linklist L;
Initlinklist(&L);
printf("请输入要插入的结点的长度:");
scanf("%d",&length);
printf("\n");
for(i=0;i<length;i++){
printf("请输入要插入第%d个结点的值:",i+1);
scanf("%d",&data);
inslinklist(&L,data);
printf("\n");
}
Display(L);
printf("\n");
printf("请输入要删除的数据:");
scanf("%d",&data);
j=dellinklist(&L,data);
if(j==False){
printf("链表中没有此结点或者链表为空.");
}else{
Display(L);
}
printf("\n");
printf("关于尾插法插入结点:\n");
Initlinklist(&L);
insrlinklist(&L);
Display(L);
printf("\n");
}
运行结果如下:
请输入要插入的结点的长度:3
请输入要插入第1个结点的值:12
请输入要插入第2个结点的值:13
请输入要插入第3个结点的值:23
链表的全部数据为:
23 13 12
请输入要删除的数据:13
链表的全部数据为:
23 12
关于尾插法插入结点:
请输入尾插法的链表的长度:4
请输入第1个结点的值:12
请输入第2个结点的值:13
请输入第3个结点的值:24
请输入第4个结点的值:35
链表的全部数据为:
12 13 24 35
Press any key to continue
相关文章推荐
- 线性表的链式存储格式基本操作:创建链表、插入、删除、查找、求表长、打印链表
- (2)单链表的操作 ① 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。 ② 实现该线性表的遍历。 ③ 在该单链表的第i个元素前插入一个整数。 ④ 删除该单链表中的第i个元素,其值通过参数
- C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)
- C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)
- 头插法,尾插法,创建单链表,然后删除所有结点值为x的结点
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- java实现创建链表以及插入节点,查找结点,删除节点等操作
- 数据结构一一线性表的链式存储结构之头插法和尾插法建立链表
- 线性表的链式存储的插入与删除操作
- 链表(二)——单向链表的基本操作(创建、删除、打印、结点个数统计)
- 【链表】C++链表操作大全:创建链表、遍历链表、删除链表结点、寻找环入口、链表加法、判断回文等
- 很简单的数据结构:链表线性存储的创建、取数据、数据添加、数据插入、数据删除
- 数据结构一一线性表的链式存储结构之删除操作
- 线性表链式存储(单循环链表)及其15种操作的实现
- 线性表链式存储(单链表)及其15种操作的实现
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- 数据结构(第二天)单链表的基本操作,创建单链表,头插法,尾插法,删除节点,查询节点
- 线性表链式存储结构下基本操作的实现(初始化、赋值、取值、插入、删除、归并等)
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- 对链表进行创建、结点的删除和插入操作