单链表的基本操作

来源:互联网 发布:struct node *link,*p 编辑:程序博客网 时间:2024/06/06 23:54


#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

typedef int ElemType;

//定义节点类型
typedef struct Node  //typedef使定义一个对象名变为定义一个类型名
//E.G.这里的Node,*LinkedList本来是struct Node的对象,加了typedef就变成了类型名
{
 ElemType data;  //单链表中的数据域
 struct Node *next; //单链表中的指针域
}Node, *LinkedList;

//单链表的初始化
LinkedList LinkedListInit()
{
 Node *L;
 L = (Node*)malloc(sizeof(Node)); //申请节点空间
 if (L == NULL)      //判断是否有足够的内存空间
  printf("申请内存空间失败\n");
 L->next = NULL;  //将next设置为NULL,初始长度为0的单链表
 return L;
}

//单链表的建立,头插法建立单链表
LinkedList LinkedListCreateHead()
{
 Node* L;
 L = (Node*)malloc(sizeof(Node)); //申请头结点空间
 L->next = NULL; //初始化一个空链表

 ElemType x;
 while (scanf_s("%d", &x) != EOF)
 {
  Node *p;
  p = (Node*)malloc(sizeof(Node)); //申请新的结点
  p->data = x;  //结点数据域赋值
  p->next = L->next;  //p指向的结点中的next指针指向L指向的头结点中next指针指向的位置,p取代了L
  L->next = p;  // L指向的结点中的next指针p指向的结点,头结点指向p指向的结点
 }

 return L;
}

//单链表的建立,尾插法建立单链表
LinkedList LinkedListCreateBehind()
{
 Node* L;
 L = (Node*)malloc(sizeof(Node)); //申请头结点空间
 L->next = NULL; //初始化一个空链表
 Node* r;
 r = L; //r始终指向终端结点,开始时指向头结点
 ElemType x;  //x为链表数据域中的数据
 while (scanf_s("%d", &x) != EOF)
 {
  Node *p;
  p = (Node*)malloc(sizeof(Node)); //申请新的结点
  p->data = x;  //结点数据域赋值
  r->next = p;  // r指向p指向的结点
  r = p;
 }
 r->next = NULL;

 return L;
}


//单链表的插入,在链表的第i个位置插入x的元素
LinkedList LinkedListInsert(LinkedList L, int i, ElemType x)
{
 Node *pre;  //pre为前驱结点
 pre = L;
 int tempi = 0;

 for (tempi = 1; tempi < i; tempi++)
 {
  pre = pre->next;
 }

 Node *p;  //插入的结点为P
 p = (Node*)malloc(sizeof(Node));  // 为p申请一个结点空间
 p->data = x;  //将x给p结点中data
 p->next = pre->next;  //p取代pre指向目标位置
 pre->next = p;

 return L;  //返回链表
}


//单链表的删除,在链表中删除值为x的元素
LinkedList LinkedListDelete(LinkedList L, ElemType x)
{
 Node *p, *pre;  //p为要查找的元素,pre为前驱结点
 p = L;  //L指向头结点
 pre = NULL;
 //用p,pre两个指针去取代链表中的指针,进行一些操作来删除元素

 while (p->data != x)  //查找数据为x的结点
 {
  pre=p;
  p = p->next;  //找不到x就把p给pre,然后p指向下一个,然后看下一个p是不是x
 }

 pre->next = p->next;  
 // 这行是关键。找到了p,就将p的下一个结点给pre,这样就跳过了x

 free(p);  //将x的空间释放
 return L;
}


int main()
{
 LinkedList list, start;

 printf("请输入单链表的数据: ");
 list = LinkedListCreateBehind();

 for (start = list->next; start != NULL; start = start->next)
 {
  printf("%d", start->data); //输出链表list
  printf("  ");  
 }
 printf("\n");

 int i;
 ElemType x;
 printf("请输入插入数据的位置: ");
 scanf_s("%d", &i);
 printf("请输入插入数据的值: ");
 scanf_s("%d", &x);

 LinkedListInsert(list, i, x);  //在链表list的第i个位置插入数据为x的结点

 for (start = list->next; start != NULL; start = start->next)
 {
  printf("%d", start->data);  //输出链表list
  printf("  ");
 }
 printf("\n");

 printf("请输入要删除元素的值: ");
 scanf_s("%d", &x);

 LinkedListDelete(list, x);  //删除数据为x的结点

 for (start = list->next; start != NULL; start = start->next)
 {
  printf("%d", start->data);  //输出链表list
  printf("  ");
 }
 printf("\n");


 system("pause");
 return 0;
}

0 0
原创粉丝点击