欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

创建链表(表头插入、表尾插入)

最编程 2024-06-11 12:16:24
...
#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
  int data;
  struct Node *next;
}node;

尾插法创建链表

node *creat1(int n)//尾插法创建链表
{
  node *p,*head,*r;//r是指向之前节点的指针,p是当前节点的指针,head是头指针
  head=(node *)malloc(sizeof(node));
  scanf("%d",&head->data);
  r=head;
  int i;
  for(i=0;i<n-1;i++){
    p=(node *)malloc(sizeof(node));
    scanf("%d",&p->data);
    r->next=p;
    p->next=NULL;
    r=p;
  }
  return head;
}

头插法创建链表

node *creat0(int n)//头插法创建链表
{
  node *p,*head,*r;//r是指向之前节点的指针,p是当前节点的指针,head是头指针
  p=(node *)malloc(sizeof(node));
  scanf("%d",&p->data);
  p->next=NULL;
  r=p;
  head=p;
  int i;
  for(i=0;i<n-1;i++){
    p=(node *)malloc(sizeof(node));
    scanf("%d",&p->data);
    p->next=r;
    head=p;
    r=p;
  }
  return head;
}

打印链表

void node_printf(node *head)//打印链表
{
  node *p=head;
  while(p!=NULL){
    printf("%d\n",p->data);
    p=p->next;
  }
}

删除节点

node *node_delect(node *head,int data)//删除节点
{
  node *p=head,*pre;
  while(p&&p->data!=data){
    pre=p;
    p=p->next;
  }
  if(p!=NULL)
    pre->next=p->next;
  return p;
}
void node_delect(node *head)//删除节点版本2
{
  node *p=head,*pre;
  int t;
  printf("删除的ID=");
  scanf("%d",&t);
  while(p&&p->data!=t){
    pre=p;
    p=p->next;
  }
  if(p!=NULL)
    pre->next=p->next;
  if(p)
    node_printf(head);
  else
    printf("NONE data\n");
}

按升序创建链表,Head是虚头节点

void creat(node *Head)//按升序创建链表,Head是虚头节点
{
  node *p,*pTemp,*pre;
  int t=1;
  pTemp=(node *)malloc(sizeof(node));
  cd_creat(pTemp);
  pre=Head;
  p=Head->next;
  while(p!=NULL){
    if(pTemp->id<p->id){
      pre->next=pTemp;
      pTemp->next=p;
      t=0;
    }
    pre=p;
    p=p->next;
  }
  if(t){
    pre->next=pTemp;
    pTemp->next=p;
  }
}

检索链表,并返回节点指针

node *node_find(node *head,int data)//检索链表,并返回节点指针
{
  node *p=head;
  while(p->data!=data){
    p=p->next;
  }
  return p;
}

推荐阅读