创建非循环链表

来源:互联网 发布:蓝月传奇官职升级数据 编辑:程序博客网 时间:2024/05/16 14:38
/*
2017年6月16日 09:13:09
 数据结构(c)
  创建非循环链表
  (disunderstand 2)
*/
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct Node
{
 int data;
 struct Node * pNext;
}NODE, *PNODE;

//函数声明
PNODE create_list(int len);//创建非循环链表
void traverse_list(PNODE pHead);//便历链表
bool find_list (PNODE pHead, int val, int loc);//在链表中第loc的地方查找是否有val这个值
bool insert_list (PNODE pHead, int val, int loc);//在链表中第loc的地方插入val这个值
bool is_empty(PNODE pHead);//判断链表是否为空
bool delete_list (PNODE pHead, int loc, int * val);//删除链表指定位置的值
void sort_list (PNODE pHead);//排序
int lenth_list (PNODE pHead);//求长度
//主函数
int main (void)
{
 int val;
 PNODE pHead = NULL;
 pHead = create_list(5);
 printf("\n便历链表\n");
 traverse_list(pHead);
 
 printf("\n查找链表中某个值\n");
 if (find_list (pHead, 5, 3))
  printf ("链表中有这个值\n");
 else
  printf ("链表中没有这个值\n");
 printf("\n删除链表中某个位置值\n");
 delete_list (pHead, 3, &val);
 printf("\n便历链表\n");
 traverse_list(pHead);
 //长度
 int len = lenth_list (pHead);
 printf ("\n长度:%d\n", len);
 //排序
 sort_list (pHead);
 printf("\n排序\n");
 traverse_list(pHead);
 //插入
 insert_list (pHead, 44, 3);
 printf("\n插入\n");
 traverse_list(pHead);


 return 0;
}
//创建非循环链表
PNODE create_list(int len)
{
 int i;
 int val;
 PNODE pHead = (PNODE) malloc (sizeof(NODE));
 if (NULL == pHead)
 {
  printf ("内存分配失败\n");
  exit (-1);
 }
 PNODE pTail = pHead;
 pHead->pNext = NULL;
 for (i = 0; i < len; ++i)
 {
  printf ("请输入第%d个节点的值: ", i + 1);
  scanf ("%d", &val);
  
  PNODE pNew = (PNODE) malloc (sizeof (NODE));
  
  if (NULL == pNew)
  {
   printf ("内存分配失败\n");
   exit (-1);
  }
  pNew ->data = val;
  pTail -> pNext = pNew;
  pNew -> pNext = NULL;
  pTail = pNew;
 }
 return pHead;
}
//便历链表
void traverse_list(PNODE pHead)
{
 if (NULL == pHead ->pNext )
  printf ("链表为空");
 pHead = pHead->pNext ;
 while (NULL != pHead)
 {
  printf (" %d ", pHead->data );
  pHead = pHead->pNext ;
 }
 printf ("\n");
 return;
}
//查找链表中的某一个值
bool find_list (PNODE pHead, int val, int loc)
{
 int i = 0;
 int n = 1;
 if (NULL == pHead ->pNext )
  printf ("链表为空");
 pHead = pHead->pNext ;
 while (NULL != pHead)
 {
  if (n == loc)
  {
   if (val == pHead->data )
   {
    i = 1;
   }
  }
  pHead = pHead->pNext ;
  ++n;
 }
 if (1 == i)
  return true;
 else
  return false;
}
//判断链表是否为空
bool is_empty(PNODE pHead)
{
 if (NULL == pHead->pNext )
  return true;
 else
  return false;
}
//删除链表指定位置的值(disunderstand 1)
bool delete_list (PNODE pHead, int loc, int * val)
{
 int i = 0;
 PNODE p = pHead;
 
 while (NULL != p->pNext  && i < loc - 1)
 {
  p = p->pNext ;
  ++i;
 }
 if (i > loc - 1 || NULL == p->pNext )
  return false;
 PNODE q = p->pNext ;
 *val = q->data ;
 p->pNext  = p->pNext ->pNext ;
 free(q);
 q = NULL;
 return true;
 
}
//排序
void sort_list (PNODE pHead)
{
 PNODE m, n;
 int t, i, j;
 int len = lenth_list (pHead);
 
 for (i = 0, m = pHead->pNext  ; i < len - 1; i++, m = m ->pNext )
 {
  for(j = i + 1, n = m ->pNext  ; j < len; j++, n = n ->pNext )
  {
   if (m->data > n->data )
   {
    t = m->data;
    m->data = n->data;
    n->data = t;
   }
  }
 }
 return;
}
//链表长度
int lenth_list (PNODE pHead)
{
 int i = 0;
 PNODE s = pHead->pNext ;
 while (NULL != s)
 {
  i++;
  s = s->pNext ;
 }
 return i;
}
//在链表中第loc的地方插入val这个值(disunderstand 2)
bool insert_list (PNODE pHead, int val, int loc)
{
 int i = 0;
 PNODE p = pHead;
 while (NULL != p && i < loc - 1)
 {
  p = p->pNext ;
  ++i;
 }
 if (i > loc -1 || NULL == p)
  return false;
 
 PNODE pNew = (PNODE)malloc(sizeof(NODE));
 if (NULL == pNew)
 {
  printf("分配失败\n");
  exit(-1);
 }
 int n = 0;
 pNew->data = val;
 PNODE q = p->pNext ;
 p->pNext = pNew;
 pNew->pNext = q;
 return true;
 
}
原创粉丝点击