数据结构请编程实现一个对单链表进行基本操作系统,主要包括链表的创建,查询,插入,删除,销毁等操作。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构请编程实现一个对单链表进行基本操作系统,主要包括链表的创建,查询,插入,删除,销毁等操作。相关的知识,希望对你有一定的参考价值。

数据结构请编程实现一个对单链表进行基本操作系统,主要包括链表的创建,查询,插入,删除,销毁等操作。(要求:可以采用带头结点和不带头结点的单链表)

#include<stdio.h>
#include<stdlib.h>
struct node
 int data;
 struct node *next;

struct node *creat_linklist()

    struct node *head ,*tail,*p;int x;
    head=tail=NULL;
    printf("\\n请输入一个整数: ");
    scanf("%d",&x);
    while(x!=0)
    
       p=(struct node *)malloc(sizeof(struct node));
       p->data=x;
       p->next=NULL;
       if(head==NULL)head=tail=p;
       else 
       
         tail->next=p;
         tail=p;
       
       printf("请输入一个整数: ");
       scanf("%d",&x);
     
    return head;



//查找
 int find(struct LNode **p,int i) 
    int j=1;
    struct LNode *q=*p;
    while (j<i && q!=NULL) /**//*查找第i个结点*/
    
        q=q->next;j++;
    
    if (q!=NULL)  /**//*找到了第i个结点*/
        return(q->data);
    else
    
        printf("位置参数不正确!\\n");
        return NULL;
    
    

 //插入
struct node *insert(struct node *head,int value)

 struct node *newp,*p,*q;
  newp=(struct node *)malloc(sizeof(struct node));
  newp->data=value;
  p=head;
  if(head==NULL)head=newp; newp->next=NULL;
  else 
   
      while((p->next !=NULL) && (p->data<value))
      q=p; p=p->next;
      if(p->data>=value)
       if(head==p)newp->next=head;
                    head=newp;
        else
         
           q->next=newp;
            newp->next=p;
         
        
      else
       
         p->next=newp;
         newp->next=NULL;
        
  
 return head;

//链表的删除
struct node *delete_link(struct node *head ,int value)

   struct node *p,*q;
     p=head;
     if(head==NULL)
      
         printf("这是一个空链表!\\n");
          return head;
       
      while((p->next!=NULL)&&(p->data!=value))
     
        q=p;p=p->next;
      
      if(value==p->data)
       
          if(head==p)head=p->next;
          else q->next=p->next;
          free(p);
        
       else
           printf("此链表无%d!\\n",value);
            return head;

/*输出链表*/
void PrintList(struct node *head)

    struct node *p;
    p=head;
    do
    
        printf("%d\\n",p->data);
        p=p->next;
    
    while(p!=NULL);

/*链表的销毁*/
void destroy_link(struct node *L ) 
  
   struct node *q=NULL;  
   struct node *p=L;  
    while(p)  
      
        q=p->next;  
        free(p);  
        p=q;  
      
 
/*主函数*/
int main()  
  
      int value;
      struct node *head;
     head=creat_linklist();
     printf("\\n");
     PrintList(head);
     printf("请输入一个要添加的整数: ");
     scanf("%d",&value);
     head=insert(head,value);
     PrintList(head);
     printf("\\n");
     printf("请输入一个要删除的整数: ");
       scanf("%d",&value);
     head=delete_link(head,value); 
     PrintList(head);
     printf("\\n");
     destroy_link(head);
     system("pause");  
     return 0;  

参考技术A 最基本的你写的也不对 参考技术B o no 这中是最基本的东西了,你还要来问别人

C语言实现单链表基本操作

目录

🏳️‍🌈开讲啦!!!!🏳️‍🌈苏州程序大白🏳️‍🌈

🌟博主介绍

💂 个人主页:苏州程序大白

🤟作者介绍:中国DBA联盟(ACDU)成员,CSDN全国各地程序猿(媛)聚集地管理员。目前从事工业自动化软件开发工作。擅长C#、Java、机器视觉、底层算法等语言。2019年成立柒月软件工作室。

💬如果文章对你有帮助,欢迎关注、点赞、收藏(一键三连)和C#、Halcon、python+opencv、VUE、各大公司面试等一些订阅专栏哦

🎗️ 承接各种软件开发项目

💅 有任何问题欢迎私信,看到会及时回复

👤 微信号:stbsl6,微信公众号:苏州程序大白

🎯 想加入技术交流群的可以加我好友,群里会分享学习资料

存储结构

typedef int DataType;  // 数据类型
typedef struct Node {
    DataType data;   // 结点数据
    struct Node *next; // 指向下一个结点的指针
} Node, *LinkList;

基本功能

  • 头插法创建单链表void CreateListHead( LinkList &head)

  • 尾插法创建单链表void CreateListTail( LinkList &head)

  • 获取指定位置的元素 int GetElement(LinkList head, int i, DataType &e)

  • 获取指定元素的位置 int LocateElement(LinkList head, int e)

  • 在指定位置插入元素 int InsertList(LinkList head, int i, DataType e)

  • 删除指定位置的元素 int DeleteList(LinkList head, int i, DataType &e)

  • 获取单链表的长度 int LengthLinkList(LinkList head)

  • 合并两个非递减的单链表 void MergeList(LinkList La, LinkList Lb, LinkList &Lc)

  • 寂链表void Destroy( LinkList &L)

  • 遍历打印单链表中的所有元素 void PrintList(LinkList head)

头插法创建单链表

每次添加链的结点都能找到头结点的第1号位置,所以创建单表中的元素的顺序是输入元素的逆序。

/**
 * 头插法创建单链表,输入以-1结束
 */
void CreateListHead(LinkList &head) {
    DataType x;
    LinkList p;

    head = (LinkList)malloc(LEN);
    head->next = NULL;
    scanf("%d", &x);
    while (x != -1) {
        p = (LinkList)malloc(LEN);
        p->data = x;
        p->next = head->next; // 新增的结点指向头结点的下一个结点
        head->next = p;  // 头结点指向新增的结点
        scanf("%d", &x);
    }
}

尾插法创建单链表

每次新增的结点都放在单链表的后面,接下来和接下来的顺序保持一致。

/**
 * 尾插法创建单链表,输入以-1结束
 */
void CreateListTail(LinkList &head) {
    LinkList p, q;
    DataType x;

    head = (LinkList)malloc(LEN);
    q = head;
  	scanf("%d", &x);
    while (x != -1) {
        p = (LinkList)malloc(LEN);
        p->data = x;
        q->next = p;
        q = p;
        scanf("%d", &x);
    }
    q->next = NULL;
}

获取指定位置的元素

/**
 * 获取指定位置的元素
 * @param head 指向单链表头结点的指针(头指针)
 * @param i 位置
 * @param e 用来存放对应位置的元素值
 * @return 0:获取失败;1:获取成功
 */
int GetElement(LinkList head, int i, DataType &e) {
    LinkList p = head->next;
    int j = 1;

    while (p && j < i) { // 依次后移,直至为空或到达位置
        p = p->next;
        j++;
    }
    if (!p || j > i) { // p为空表示位置超过最大位置,j > i表示位置不合法(i < 1)
        return 0;
    }
    e = p->data;
    return 1;
}

在指定位置插入元素

/**
 * 在单链表插入元素到位置i
 * @param head 单链表的头指针
 * @param i 插入位置
 * @param e 插入元素
 * @return 1:插入成功,0:插入失败
 */
int InsertList(LinkList head, int i, DataType e) {
    LinkList p = head; // 从头结点开始
    int j = 1;

    while (p && j < i) { // 找到插入位置的前一个结点
        p = p->next;
        j++;
    }
    if (!p || j > i) { // p为空或i < 1,插入位置不合法
        return 0;
    }
    LinkList q = (LinkList)malloc(LEN); // 创建新结点
    q->data = e;
    q->next = p->next; // 将新结点指向前一个结点的后一个结点
    p->next = q; // 前一个结点指向新结点
    // 执行上述两个操作后,达到的效果是新结点插入到了前一个结点的后面
}

删除指定位置的元素

/**
 * 删除指定位置的元素
 * @param head
 * @param i 位置
 * @param e 被删除的元素的值存放在e中
 * @return 1:删除成功,0:删除失败
 */
int DeleteList(LinkList head, int i, DataType &e) {
    LinkList p = head;
    int j = 1;

    while (p && j < i) {  // 找到位置的前一个结点
        p = p->next;
        j++;
    }
    if (!p || j > i) {
        return 0;
    }
    LinkList s = p->next;
    e = s->data;
    p->next = s->next; // 改变前一个结点的指向,使其指向删除结点的后一个结点
    free(s); 
    return 1;
}

获取单链表的长度

/**
 * 获取单链表的长度
 * @param head
 * @return 单链表的长度
 */
int LengthLinkList(LinkList head) {
    LinkList p = head->next;
    int count = 0;

    while (p) {
        count++;
        p = p->next;
    }
    return count;
}

合并两个非递减的单链表

合并两个非递减的单链,新链表仍然保持非递减。

/**
 * 合并两个非递减的单链表,新的链表仍然非递减
 * @param La
 * @param Lb
 * @param Lc
 */
void MergeList(LinkList La, LinkList Lb, LinkList &Lc) {
    LinkList pa, pb, pc;

    pa = La->next;
    pb = Lb->next;
    pc = Lc = (LinkList)malloc(LEN);

    while (pa && pb) {
        if (pa->data <= pb->data) {
            pc->next = pa;
            pc = pa;
            pa = pa->next;
        } else {
            pc->next = pb;
            pc = pb;
            pb = pb->next;
        }
    }
    pc->next = pa ? pa : pb;
    free(Lb);
}

晴链表

/**
 * 销毁链表
 */
void Destroy(LinkList &L) {
    LinkList p, q;
    p = L;
    while (p) { // 遍历所有结点,释放内存
        q = p;
        p = p->next;
        free(q);
    }
    L = NULL; // L置为NULL
}

遍历打印单链表

/**
 * 遍历打印单链表的所有元素
 */
void PrintList(LinkList head) {
    LinkList p = head->next;

    if (p == NULL) {
        cout << "List is NULL!" <<endl;
    } else {
        while (p != NULL) {
            printf("%d ", p->data);
            p = p->next;
        }
        printf("\\n");
    }
}

附上完整代码

#include<iostream>
#include<cstdlib>

using namespace std;

#define LEN sizeof(Node)

typedef int DataType;

typedef struct Node {
    DataType data;
    struct Node *next;
} Node, *LinkList;

/**
 * 头插法创建单链表
 * @param head
 */
void CreateListHead(LinkList &head) {
    DataType x;
    LinkList p;

    head = (LinkList)malloc(LEN);
    head->next = NULL;
    scanf("%d", &x);
    while (x != -1) {
        p = (LinkList)malloc(LEN);
        p->data = x;
        p->next = head->next;
        head->next = p;
        scanf("%d", &x);
    }
}

/**
 * 尾插法创建单链表
 * @param head
 */
void CreateListTail(LinkList &head) {
    LinkList p, q;
    DataType x;

    head = (LinkList)malloc(LEN);
    q = head;
  	scanf("%d", &x);
    while (x != -1) {
        p = (LinkList)malloc(LEN);
        p->data = x;
        q->next = p;
        q = p;
        scanf("%d", &x);
    }
    q->next = NULL;
}

/**
 * 获取指定位置的元素
 * @param head 单链表头指针
 * @param i 位置
 * @param e 获取的元素赋值该参数
 * @return 0:获取失败;1:获取成功
 */
int GetElement(LinkList head, int i, DataType &e) {
    LinkList p = head->next;
    int j = 1;

    while (p && j < i) {
        p = p->next;
        j++;
    }
    if (!p || j > i) {
        return 0;
    }
    e = p->data;
    return 1;
}

/**
 * 获取某个元素的位置
 * @param head
 * @param e
 * @return 元素的位置
 */
int LocateElement(LinkList head, int e) {
    LinkList p = head->next;
    int j = 1;

    while (p && p->data != e) {
        p = p->next;
        j++;
    }
    if (!p) {
        return 0;
    }
    return j;
}

/**
 * 在单链表插入元素到位置i
 * @param head 单链表的头指针
 * @param i 插入位置
 * @param e 插入元素
 * @return 1:插入成功,0:插入失败
 */
int InsertList(LinkList head, int i, DataType e) {
    LinkList p = head;
    int j = 1;

    while (p && j < i) {
        p = p->next;
        j++;
    }
    if (!p || j > i) {
        return 0;
    }
    LinkList q = (LinkList)malloc(LEN);
    q->data = e;
    q->next = p->next;
    p->next = q;
}

/**
 * 删除指定位置的元素
 * @param head
 * @param i 位置
 * @param e 被删除的元素的值存放在e中
 * @return 1:删除成功,0:删除失败
 */
int DeleteList(LinkList head, int i, DataType &e) {
    LinkList p = head;
    int j = 1;

    while (p && j < i) {
        p = p->next;
        j++;
    }
    if (!p || j > i) {
        return 0;
    }
    LinkList s = p->next;
    e = s->data;
    p->next = s->next;
    free(s);
    return 1;
}

/**
 * 获取单链表的长度
 * @param head
 * @return
 */
int LengthLinkList(LinkList head) {
    LinkList p = head->next;
    int count = 0;

    while (p) {
        count++;
        p = p->next;
    }
    return count;
}

/**
 * 合并两个非递减的单链表,新的链表仍然非递减
 * @param La
 * @param Lb
 * @param Lc
 */
void MergeList(LinkList La, LinkList Lb, LinkList &Lc) {
    LinkList pa, pb, pc;

    pa = La->next;
    pb = Lb->next;
    pc = Lc = (LinkList)malloc(LEN);

    while (pa && pb) {
        if (pa->data <= pb->data) {
            pc->next = pa;
            pc = pa;
            pa = pa->next;
        } else {
            pc->next = pb;
            pc = pb;
            pb = pb->next;
        }
    }
    pc->next = pa ? pa : pb;
    free(Lb);
}

/**
 * 销毁链表
 * @param L
 */
void Destroy(LinkList &L) {
    LinkList p, q;
    p = L;
    while (p) {
        q = p;
        p = p->next;
        free(q);
    }
    L = NULL;
}

/**
 * 遍历打印单链表的所有元素
 * @param head
 */
void PrintList(LinkList head) {
    LinkList p = head->next;

    if (p == NULL) {
        cout << "List is NULL!" <<endl;
    } else {
        while (p != NULL) {
            printf("%d ", p->data);
            p = p->next;
        }
        printf("\\n");
    }
}

int main() {
    LinkList L;

    printf("头插法创建单链表:(输入以-1结束)\\n");
    CreateListHead(L);
    PrintList(L);

    printf("尾插法创建单链表:(输入以-1结束)\\n");
    CreateListTail(L);
    PrintList(L);

    InsertList(L, 1, 100);
    printf("在1号位置插入100后,单链表如下:\\n");
    PrintList(L);

    DataType e;
    DeleteList(L, 1, e); 
    printf("删除1号位置的元素,被删除的元素为:\\n");
    printf("删除后的单链表为:\\n"); 
    PrintList(L);

    printf("单链表的长度为:%d\\n", LengthLinkList(L));
    
    GetElement(L, 1, e);
    printf("1号位置的元素为:%d\\n");
    
    printf("元素4在单链表中的位置为:%d\\n", LocateElement(L, 4));

	cout << endl;
    LinkList La, Lb, Lc;
    printf("尾插法创建单链表La:\\n");
    CreateListTail(La);
    PrintList(La);
    printf("尾插法创建单链表Lb:\\n");
    CreateListTail(Lb);
    PrintList(Lb);
    MergeList(La, Lb, Lc);
    printf("合并单链表La和Lb后的新单链表Lc如下:\\n");
    PrintList(Lc);

    return 0;
}

运行结果:

注意:

写法采用了C++引用参数的写法,LinkList &head,C语言下不支持这种写法,需要在C++环境下使用,即.cpp文件。

下面附上C语言的:

/**
 * LinkList 本身已经是结构体指针,参数再使用LinkList *的形式
 * 可以理解为要想改变一个结构体指针,则需要取指针的指针。
 * 类似于改变int a,则需要使用 int *a,这里要改变LinkList head,则需要使用LinkList *head
 */
void CreatListTail(LinkList *head) {
    int x;
    LinkList *p, *q;

    *head = (LinkList *) malloc以上是关于数据结构请编程实现一个对单链表进行基本操作系统,主要包括链表的创建,查询,插入,删除,销毁等操作。的主要内容,如果未能解决你的问题,请参考以下文章

单链表的基本实现

数据结构实验报告-实验一 顺序表单链表基本操作的实现

数据结构编程求救

C语言中数据结构中的单向链表的问题;

单链表的基本操作实现

《重学数据结构与算法》:请手写一个简易的单链表