c语言_数据结构_单链表

来源:互联网 发布:实战linux编程精髓pdf 编辑:程序博客网 时间:2024/06/04 17:55

 

   将线性表L=(a0,a1,……,an-1)中各元素分布在存储器的不同存储块,称为结点,通过地址或指针建立它们之间的联系,所得到的存储结构为链表结构,表中ai的结点形式如图表示:

   其中结点的data域存放数据元素ai,next域是一个指针,指向ai的直接后继ai+1所在的结点。单链表结构如下:


c语言_数据结构_单链表

单链表的建立:

#include <stdio.h> #include <stdbool.h>#include <stdlib.h> #include <unistd.h>typedef int datatype; //声明结点,结点包括元素数据以及指针域。typedef struct node{    datatype data;  struct node *next;}linknode,*linklist; //初始化链表。1)分配内存;2)将头节点指针域指向空,该指向也是链表遍历的判断依据;3)返回头节点地址。linklist init_list(void){    linklist head = (linklist)malloc(sizeof(linknode));  head->next = NULL;   return head;} //插入结点。1)新建结点,对于链表来说,不同于顺序表一次性将总表长的内存分配完毕,因此在每次新建//结点都该给新结点newnode分配内存;2)将插入的数据赋予newnode的data域;3)定义中间结点p,p主要在//遍历过程中起作用,初始化p等于head头结点进行遍历,当p->next指向NULL时,说明当前结点为末结点,//否则继续遍历下一结点;4)在找到末结点后,将末结点p->next指针指向新结点newnode,新结//点newnode->next指向NULL,此时完成新结点的插入,新结点newnode成为末结点。bool insert_list(linklist head,datatype n){    linklist newnode = (linklist)malloc(sizeof(linknode));  newnode->data = n;  linklist p = head;  while(p->next !=NULL)    p = p->next;   newnode->next = p->next;  p->next = newnode;   return true;}//删除结点。对链表遍历,当找到对应元素结点q时,记录其直接前驱结点p,将前驱结点的next域p->next指向//q的直接后继结点p->next->next,释放q内存,完成删除工作。bool remove_list(linklist head,datatype n){    linklist p = head;   linklist q;   while(p->next != NULL)   {      if(p->next->data == n)      {         q = p->next;         p->next = p->next->next;          free(q);         return true;      }      p = p->next;   }  printf("remove failed\n");   return false;} //打印结点。void show_list(linklist head){  linklist p = head;  while(p->next != NULL)   {      p = p->next;      printf("%d\t",p->data);   }   printf("\n");} //链表逆转。依次将结点a0,a1,a2,……,an-1移到头结点作为其直接后继结点。如图:

void revert_list(linklist head){  linklist p = head->next;   linklist q;   head->next = NULL;   while(p != NULL)   {      q = p->next;      p->next = head->next;      head->next = p;      p = q;   }} //测试。输入正数则插入结点,负数则删除对应结点,最后逆转链表。int main(void){   datatype n;  linklist l = init_list();  while((scanf("%d",&n)) == 1)   {      if(n > 0)       {           if((insert_list(l,n)))             show_list(l);          else            printf("insert failed\n");      }      else      {         if((remove_list(l,-n)))             show_list(l);          else            printf("remove failed\n");      }   }   revert_list(l);   printf("revert linklist:\n");   show_list(l);   return 0;}



0 0
原创粉丝点击