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");}

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

  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 error\n"); 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((ii<location-1) && (list != NULL)){
    list = list->next;
    ii++;
  }

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

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值