#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
/**
*@Name:线性表--单链表
*@Description:单链表的创建,元素的插入、删除和修改和移动。
*@Author:Freedoman
*@Date: 2014-8-5
*/
struct Node /*结点类型*/
{
int data; /*数据域*/
struct Node * next; /*指针域*/
};
typedef struct Node * PNode;
/*函数声明*/
PNode createNullLinkedList();
int isNullLinkedList(PNode head);
PNode initializeLinkedList(PNode head);
int insertBeforeElement(PNode head);
int insertAfterElement(PNode head);
int deleteElement(PNode head);
void findBeforeAfterNode(PNode head);
void printLinkedList(PNode head);
/*------------创建带头结点的单链表----------*/
PNode createNullLinkedList(){
printf("创建带头结点的单链表\n");
PNode head = (PNode)malloc(sizeof(Node));
if(head != NULL){
head->data = -1;
head->next = NULL;
printf("创建成功!\n");
}else{
printf("创建失败!\n");
}
return head;
}
/*---------------判断当前链表是否为空--------------*/
int isNullLinkedList(PNode head){
if(head->next == NULL){
printf("当前链表为空!\n");
return 1;
}else{
printf("当前链表不为空!\n");
return 0;
}
}
/*------初始化当前单链表,默认顺序插入若干元素--------*/
PNode initializeLinkedList(PNode head){
printf("初始化当前链表\n");
int data,count = 0;
PNode p,temp;
if(isNullLinkedList(head)){
while(1){
printf("请输入元素(-1结束)>>>");
scanf("%d",&data);
if(data == -1){
break;
}
temp =(PNode)malloc(sizeof(struct Node));
temp->data = data;
temp->next=NULL;
if(count++ == 0){
head->next = temp;
p = head;
}else{
p->next->next = temp;
p = p->next;
}
}
printLinkedList(head);
}else{
printf("不能初始化!\n");
}
return head;
}
/*---------------在指定元素之前插入元素------------------*/
int insertBeforeElemente(PNode head){
printf("在指定元素之前插入元素\n");
PNode p = head;
int data;
int ele;
if(!isNullLinkedList(head)){
printf("请指定元素>>>");
scanf("%d",&ele);
printf("请输入要插入的元素>>>");
scanf("%d",&data);
while(p->next != NULL){
// 移动指针定位结点
if(p->next->data != ele){
p = p->next;
continue;
}
// 插入
PNode temp = (PNode)malloc(sizeof(Node));
temp->data = data;
temp->next = p ->next;
p->next = temp;
printf("插入成功\n");
printLinkedList(head);
return 1;
}
printf("没有找到指定元素!\n");
}
return 0;
}
/*---------------在指定元素之后插入元素------------------*/
int insertAfterElement(PNode head){
printf("在指定元素之后插入元素\n");
PNode p = head;
int data,ele;
if(!isNullLinkedList(head)){
printf("请指定元素>>>");
scanf("%d",&ele);
printf("请输入要插入的元素>>>");
scanf("%d",&data);
while(p->next != NULL){
// 移动指针定位结点
if(p->next->data != ele){
p = p->next;
continue;
}
// 插入
PNode temp = (PNode)malloc(sizeof(Node));
temp->data = data;
temp->next = p ->next->next;
p->next->next = temp;
printf("插入成功\n");
printLinkedList(head);
return 1;
}
printf("没有找到指定元素!\n");
}
return 0;
}
/*--------------删除指定元素----------------*/
int deleteElement(PNode head){
printf("删除指定元素\n");
int ele;
PNode p = head;
if(!isNullLinkedList(head)){
printf("请指定元素:");
scanf("%d",&ele);
while(p->next != NULL){
// 移动指针定位元素
if(p->next->data != ele){
p = p->next;
continue;
}
// 删除
p->next = p->next->next;
printf("删除成功\n");
printLinkedList(head);
return 1;
}
printf("没有找到指定元素!\n");
}
return 0;
}
/*---------------求指定元素的前驱和后继结点------------*/
void findBeforeAfterNode(PNode head){
printf("求指定结点的前驱结点结点\n");
int ele,i,j;
PNode p = head;
if(!isNullLinkedList(head)){
printf("请指定元素>>>");
scanf("%d",&ele);
while(p->next != NULL){
// 移动指针定位元素
if(p->next->data != ele){
p = p->next;
continue;
}
printf("前驱结点为>>>>%d\n" ,p->data);
printf("后继结点为>>>>%d\n",p->next->next->data);
break;
}
}
}
/*---------打印当前链表各元素----------*/
void printLinkedList(PNode head){
PNode p = NULL;
printf("打印[");
for( p = head; p != NULL; p = p->next){
printf(" %d ",p->data);
}
printf("]\n");
}
int main(){
int input;
PNode head = NULL;
printf("\n\n--------单链表的基本操作---------\n\n");
while(1){
printf("\n 1_创建带头结点的单链表\n 2_判断当前链表是否为空\n 3_初始化当前链表\n");
printf(" 4_在指定元素之前插入元素\n 5_在指定元素之后插入元素\n");
printf(" 6_删除指定元素\n 7_求指定元素的前驱与后继结点\n 8_打印当前链表\n");
printf("\n>>>请选择:");
scanf("%d",&input);
switch(input){
case 1 :
head = createNullLinkedList();
break;
case 2 :
isNullLinkedList(head);
break;
case 3 :
initializeLinkedList(head);
break;
case 4 :
insertBeforeElemente(head);
break;
case 5 :
insertAfterElement(head);
break;
case 6 :
deleteElement(head);
break;
case 7 :
findBeforeAfterNode(head);
break;
case 8 :
printLinkedList(head);
break;
default:
printf("输入错误!\n");
break;
}
}
}
性线表----单链表的基本操作
最新推荐文章于 2021-07-25 01:04:28 发布