链表的基本操作

来源:互联网 发布:vue双向数据绑定原理 编辑:程序博客网 时间:2024/06/09 18:55

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

//定义链表
typedef struct Node{
 int data;
 struct Node *Next;
}*Linklist;

//函数声明
Linklist Create_Linklist(void); //创建链表
void Traverse_Linklist(Linklist pHead); //遍历链表
bool is_empty(Linklist pHead); //判断链表是否为空
int Length_Linklist(Linklist pHead); //链表长度
void Sort_Linklist(Linklist pHead); //链表排序
bool Insert(Linklist pHead, int pos, int value); //将value插入到链表的第pos个节点之前
bool Delete(Linklist pHead, int pos, int *value); //删除第pos个节点,并将pos节点值赋给value

int main(void)
{
 Linklist pHead;
 int length;
 int pos, value;

 //创建链表并输出链表节点值
 pHead = Create_Linklist();
 Traverse_Linklist(pHead);
 
 //判断链表是否为空
 if(is_empty(pHead)){
  printf("链表为空!\n");
 }

 //求链表长度
 length = Length_Linklist(pHead);
 printf("链表的长度为:%d\n", length);

 //对链表中节点进行排序
 Sort_Linklist(pHead);
 Traverse_Linklist(pHead);

 //在链表中插入新节点
 printf("请输入在第几个节点之前插入:");
 scanf("%d", &pos);
 printf("请输入要插入的节点值:");
 scanf("%d", &value);

 Insert(pHead, pos, value);
 Traverse_Linklist(pHead);

 Sort_Linklist(pHead);
 Traverse_Linklist(pHead);

 //删除链表中某个节点
 printf("请输入要删除第几个节点:");
 scanf("%d", &pos);
 Delete(pHead, pos, &value);
 printf("删除的节点值是:%d\n", value);
 Traverse_Linklist(pHead);
 
 return 0;
}

Linklist Create_Linklist(void)
{
 Linklist pHead, pTail, pNew;
 int count, i, value;

 pHead = (Linklist)malloc(sizeof(Linklist));
 if(pHead == NULL){
  printf("申请动态内存失败!\n");
  exit(-1);
 }
 pTail = pHead;
 pTail->Next = NULL;

 printf("请输入要创建链表的节点个数:");
 scanf("%d", &count);
 
 for(i = 0; i < count; i++){
  printf("请输入第%d个节点的值:", i+1);
  scanf("%d", &value);

  pNew = (Linklist)malloc(sizeof(Linklist));
  if(pNew == NULL){
   printf("申请动态内存失败!\n");
   exit(-1);
  }

  pNew->data = value;
  pTail->Next = pNew;
  pTail = pNew;
 }
 pTail->Next = NULL;

 return pHead;
}

void Traverse_Linklist(Linklist pHead)
{
 Linklist p = pHead->Next;

 while(p != NULL){
  printf("%d ", p->data);
  p = p->Next;
 }
 printf("\n");

 return;
}

bool is_empty(Linklist pHead)
{
 if(pHead->Next == NULL){
  return true;
 }else{
  return false;
 }
}

int Length_Linklist(Linklist pHead)
{
 Linklist p = pHead->Next;
 int length = 0;

 while(p){
  length++;
  p = p->Next;
 }

 return length;
}

void Sort_Linklist(Linklist pHead)
{
 Linklist p, q;
 int length = Length_Linklist(pHead);
 int i, j, t;

 for(i = 0, p = pHead->Next; i < length-1; i++, p = p->Next){
  for(j = i+1, q = p->Next; j < length; j++, q = q->Next){
   if(p->data > q->data){
    t = p->data;
    p->data = q->data;
    q->data = t;
   }
  }
 }

 return;
}

bool Insert(Linklist pHead, int pos, int value)
{
 Linklist p = pHead, pNew;
 int i = 0;

 while(p && (i < pos - 1)){
  i++;
  p = p->Next;
 }

 if((p == NULL) && (i > pos - 1)){
  return false;
 }

 pNew = (Linklist)malloc(sizeof(Linklist));
 if(pNew == NULL){
  printf("申请动态空间失败!\n");
  exit(-1);
 }

 pNew->data = value;
 pNew->Next = p->Next;
 p->Next = pNew;

 return true;
}

bool Delete(Linklist pHead, int pos, int *value)
{
 Linklist p = pHead, q = NULL;
 int i = 0;

 while((p->Next != NULL) && (i < pos - 1)){
  i++;
  p = p->Next;
 }

 if((p->Next == NULL) || (i > pos - 1)){
  return false;
 }

 q = p->Next;
 *value = q->data;
 p->Next = p->Next->Next;
 free(q);

 return true;
}

原创粉丝点击