栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言链表操作

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言链表操作

1.实现创建链表,打印链表,摧毁链表的基本操作,代码如下

所用的结构体定义:

typedef int DATATYPE;

typedef struct Node{
  DATATYPE data;
  struct Node *next;
}Node, *linkList;

main函数实现整体框架

int main()
{
  char display[64+1] = {0};
  //定义一个链表
  Node *list = NULL;

  //初始化链表,主要是生成一个头节点
  list=initList();

  //初始插入1,2,3,4,5,6,7,8,9,10
  //给链表插入数据
  for(int i = 1; i<=10; i++)
    insertList(list, 1, i);

  //打印插入的数据
  sprintf(display, "创建");
  printList(list, display);

  //在第八位插入33
  int data = 33;
  insertList(list, 8, data);

  //打印插入的数据
  memset(display, 0, sizeof(display));
  sprintf(display, "第%d位插入%d", 8,data);
  printList(list, display);

  //表头插入数据
  data = 66;
  pushHead(list, data);

  //打印插入的数据
  memset(display, 0, sizeof(display));
  sprintf(display, "表头插入");
  printList(list,display);

  //表尾插入数据
  data = 77;
  pushEnd(list, data);

  //打印插入的数据
  memset(display, 0, sizeof(display));
  sprintf(display, "表尾插入");
  printList(list,display);

  //删除指定结点
  deleteNode(list, 8);
  memset(display, 0, sizeof(display));
  sprintf(display, "删除第8位");
  printList(list,display);


  //摧毁链表
  destoryList(list);

  return 0;
}

运行结果如下:

 

初始化链表:

//初始化链表
Node *initList()
{
  Node *head=(Node *)malloc(sizeof(Node));

  if(head == NULL) {
    printf("分配头指针失败!!n");
    return NULL;
  }

  head->next = NULL;

  return head;
}

创建整个链表/插入数据:

//插入数据
void insertList(linkList list, int location, DATATYPE data )
{
  Node *pList=NULL;

  if((list ==NULL) || (location<0)) { printf("链表不存在或者插入位置不对!!n");}

  
  //中途插入数据需要找到前面location-1个
  int ii = 0;
  while( (ii< (location-1)) && (list != NULL) ){
    list = list->next;
    ii++;
  }
  

  pList=list;

  Node *temp=(Node *)malloc(sizeof(Node));

  //插入数据
  //strcpy(temp->data, data );
  temp->data = data;

  //插入新的结点
  temp->next = pList->next;
  pList->next = temp;

}

打印整个链表:

//打印链表数据
void printList(linkList list, char *display)
{
  Node* pList=NULL;

  if(list == NULL) {printf("链表不存在!!!n");}

  //从第一个结点开始打印,注意不是头节点
  pList = list->next;

  printf("链表:%s [", display);
  while(pList != NULL){
    printf("%d ", pList->data);
    pList = pList->next;
  }
  printf("]n");
}

摧毁整个链表:

//摧毁链表
void destoryList(linkList list)
{
  Node *temp=NULL;

  while(list != NULL){
    temp = list->next;    //temp保存下一个结点地址
    free(list);           //释放当前结点
    list = temp;          //移动到下一个结点
  }
}

表头插入:

//表头插入数据
void pushHead(linkList list, DATATYPE data)
{
  insertList(list, 1, data);
}

表尾插入数据:

//表尾插入数据
void pushEnd(linkList list, DATATYPE data)
{
  if(list == NULL) {printf("链表不存在!!!n"); return;}

  //先要找到尾结点
  while(list->next != NULL){
    list = list->next;
  }

  Node *temp = (Node *)malloc(sizeof(Node));
  if(temp == NULL) {printf("malloc errorn"); return;}

  //尾结点next置为NULL
  temp->next = NULL;
  temp->data = data;
  list->next = temp;
}

删除指定结点:

//删除指定结点
void deleteNode(linkList list, int location)
{
  if((list == NULL) || (location < 0)) {printf("链表不存在或者需要删除的结点位置错误!!!n");}

  //要找到指定结点前一个结点
  int ii = 0;
  while((iinext;
    ii++;
  }

  //判断指定的被删结点是不是尾结点
  if(list->next == NULL) {printf("被删结点位置不合法!!n"); return ;};
  Node *temp = list->next;  //temp存放需要删除的结点
  list->next = temp->next;  //被删结点前一个结点的next指向被删结点的下一个结点
  free(temp);

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/604753.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号