代码1

#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>

#define true 1
#define false 0
typedef int bool;

typedef struct Node
{
    int val;
    struct Node * next;
}NODE, *PNODE;

//函数声明
void traverse_list(PNODE pHead);
PNODE create_list(void);
bool is_empty(PNODE);
int length_list(PNODE);
bool insert_list(PNODE, int, int);
bool delete_list(PNODE, int, int*);
void sort_list(PNODE);

//对链表元素进行排序
void sort_list(PNODE pHead)
{
    int len = length_list(pHead);
    if (len <= 1)
    {
        printf("链表元素太少,无法执行排序操作");
        return;
    }
    int i, j, temp;
    PNODE p;                    //现在 p 指向的是首节点
    for (i = 0; i<len; i++)
    {
        p = pHead->next;          // 每一次循环执行时,需要从当前首节点向后执行
        for (j = 0; j<len - i - 1; j++)
        {
            if (p->val < p->next->val)
            {
                temp = p->val;
                p->val = p->next->val;
                p->next->val = temp;
            }
            p = p->next;
        }
    }//冒泡排序

}
//删除某个元素
bool delete_list(PNODE pHead, int pos, int* val)
{
    int i = 0;
    PNODE p = pHead;
    while (NULL != p->next && i<pos - 1)
    {
        p = p->next;
        i++;
    }
    if (i>pos - 1 || NULL == p->next)
    {
        return false;
    }
    PNODE r = p->next;  // 用 r 记住后,用来释放内存,防止内存泄露
    *val = p->next->val;
    p->next = p->next->next;
    free(r);
    r = NULL;
    return true;

}

//插入某个元素
bool insert_list(PNODE pHead, int pos, int value)
{

    int i = 0;
    PNODE p = pHead;
    while (NULL != p->next&&i<pos - 1)
    {
        p = p->next;
        i++;
    }
    if (i>pos - 1 || NULL == p->next)
    {
        return false;
    }
    //程序执行到这个地方时,说明已经找到了要插入的位置
    PNODE q = (PNODE)malloc(sizeof(NODE));
    if (NULL == q)
    {
        printf("内存分配失败,程序将退出");
        exit(-1);
    }
    q->val = value;
    q->next = p->next;
    p->next = q;
    return true;

}

//求链表的长度
int length_list(PNODE pHead)
{
    int len = 0;
    PNODE p = pHead;
    while (NULL != p->next)
    {
        len++;
        p = p->next;
    }
    return len;
}
bool is_empty(PNODE pHead)
{
    if (NULL == pHead->next)
    {
        return true;
    }
    else
    {
        return false;
    }
}

//构造链表
PNODE create_list(void)
{
    int len, i, value;
    printf("请输入您要创建的链表中的元素个数 len = ");
    scanf("%d", &len);
    PNODE pHead = (PNODE)malloc(sizeof(NODE));   //   最后需要返回的头指针
    pHead->next = NULL;
    PNODE pTail = pHead;                         // 最开始的时候尾指针指向头指针,因为元素个数为零。

    for (i = 0; i<len; i++)
    {
        PNODE pNew = (PNODE)malloc(sizeof(NODE));   //分配一个新节点
        printf("请输入第%d个元素中的value值 value = ", i + 1);
        scanf("%d", &value);
        pNew->val = value;       //构造新节点的值
        pNew->next = NULL;    // 构造新节点的指针域
        pTail->next = pNew;     // 将新节点挂到尾节点上
        pTail = pNew;              //更新尾节点,新挂上的节点为尾节点
    }

    return pHead;
}
//遍历整个链表,并输出
void traverse_list(PNODE pHead)
{
    PNODE p = pHead->next;
    while (NULL != p)
    {
        printf("%d ", p->val);
        p = p->next;
    }
    printf("\n");
}

//主函数
int main()
{

    PNODE pHead = create_list();
    traverse_list(pHead);
    if (is_empty(pHead))
    {
        printf("empty\n");
    }
    else
    {
        printf("not empty\n");
    }
    printf("------------------------------------------\n");
    int len = length_list(pHead);
    printf("链表的长度为 %d \n", len);
    printf("------------------------------------------\n");
    int val, pos;
    printf("请输入您要插入的位置 pos = ");
    scanf("%d", &pos);
    printf("请输入您要插入的数据 val = ");
    scanf("%d", &val);
    insert_list(pHead, pos, val);
    printf("------------------------------------------\n");
    printf("插入数据后的链表为\n");
    traverse_list(pHead);
    printf("------------------------------------------\n");
    printf("请输入您要删除的元素的位置为:");
    scanf("%d", &pos);
    while (!delete_list(pHead, pos, &val))
    {
        printf("删除失败,请重新输入要删除元素的位置");
        scanf("%d", &pos);
    }
    printf("删除后的链表遍历为:\n");
    traverse_list(pHead);
    printf("您删除的位置所在处的元素为:%d  \n", val);
    printf("------------------------------------------\n");

    sort_list(pHead);
    printf("排序后的链表输出为:\n");
    traverse_list(pHead);
    return 0;
}





////希尔排序
//void prshl(p, n)
//int n;
//double p[];
//{
//  int k, j, i;
//  double t;
//  k = n / 2;
//  while (k > 0)
//  {
//      for (j = k; j <= n - 1; j++)
//      {
//          t = p[j]; i = j - k;
//          while ((i > 0) && (p[i]) > t)
//          {
//              p[i + k] = p[i]; i = i - k;
//
//          }
//          p[i + k] = t;
//      }
//      k = k / 2;
//  }
//  return;
//}
//
////冒泡排序
//main()
//{
//  int a[11];
//  int i, j, k;
//  printf("intput 10 numbers:\n");
//  for (i = 1; i < 11; i++)
//      scanf("%d", &a[i]);
//  printf("\n");
//  for (i = 1; i <= 9;i++)
//  for (j = 1; j <= 10 - i; j++)
//      if (a[j]>a[j + 1])
//      {
//          k = a[j]; a[j] = a[j + 1]; a[j + 1] = k;
//      }
//      printf("the sorted numbers:\n");
//      for (i = 1; i < 11; i++)
//          printf("%d", a[i]);
//}
//直接插入排序
//void docr(float*in, int count)
//{
//  int i, j, x;
//  float temp;
//  for (i = 1; i < count; i++)
//  {
//      for (x = 0; x < i; x++)
//      {
//          if ((*(in + i)) <= (*(in + x)))
//              break;
//      }
//      temp = *(in + i);
//      for (j = i; j>x; j--)
//      {
//          *(in + j) = *(in + j - 1);
//      }
//      *(in + x) = temp;
//  }
//
//}
//二分法插入排序
//void docr(float*in, int count)
//{
//  int i, j, x;
//  int l, r, m;
//  float temp;
//  for (i = 1; i < count; i++)
//  {
//      l = 0;
//      r = i - 1;
//      temp = *(in + i);
//      while (l<=r)
//      {
//          m = (int)((l + r) / 2);
//          if (temp <= (*(in + m)))
//          {
//              r = m - 1;
//          }
//          else
//          {
//              l = m + 1;
//          }
//      }
//      for (j = i; j > l; j--)
//      {
//          *(in + j) = *(in + j - 1);
//      }
//      *(in + l) = temp;
//  }
//}
//
///*--------------------冒泡排序---------------------*/
//void bubleSort(int data[], int n)
//{
//  int i, j, temp;
//  两个for循环,每次取出一个元素跟数组的其他元素比较
//  将最大的元素排到最后。
//  for (j = 0; j<n - 1; j++)
//  {
//      外循环一次,就排好一个数,并放在后面,
//      所以比较前面n-j-1个元素即可
//      for (i = 0; i<n - j - 1; i++)
//      {
//          if (data[i]>data[i + 1]) 
//          {
//              temp = data[i];
//              data[i] = data[i + 1];
//              data[i + 1] = temp;
//          }
//      }
//  }
//}
//
///*--------------------快速排序---------------------*/
//int findPos(int data[], int low, int high) 
//{
//  将小于t的元素赶到t的左边,大于t的元素赶到t的右边
//  int t = data[low];
//  while (low < high) 
//  {
//      while (low < high && data[high] >= t)
//      {
//          high--;
//      }
//      data[low] = data[high];
//      while (low < high && data[low] <= t) 
//      {
//          low++;
//      }
//      data[high] = data[low];
//  }
//  data[low] = t;
//  返回此时t在数组中的位置
//  return low;
//}
//在数组中找一个元素,对大于该元素和小于该元素的两个数组进行再排序
//再对两个数组分为4个数组,再排序,直到最后每组只剩下一个元素为止
//void quickSort(int data[], int low, int high) 
//{
//  if (low > high) 
//  {
//      return;
//  }
//  int pos = findPos(data, low, high);
//  quickSort(data, low, pos - 1);
//  quickSort(data, pos + 1, high);
//}
//
///*--------------------插入排序---------------------*/
//void bInsertSort(int data[], int n) 
//{
//  int low, high, mid;
//  int temp, i, j;
//  for (i = 1; i<n; i++) 
//  {
//      low = 0;
//      把data[i]元素插入到它的前面data[0-(i-1)]中
//      temp = data[i];
//      high = i - 1;
//      该while是折半,缩小data[i]的范围(优化手段)
//      while (low <= high)
//      {
//          mid = (low + high) / 2;
//          if (data[mid] > temp) 
//          {
//              high = mid - 1;
//          }
//          else {
//              low = mid + 1;
//          }
//      }
//      int j = i;
//      让data与已经排序好的数组的各个元素比较,小的放前面
//      while ((j > low) && data[j - 1] > temp) 
//      {
//          data[j] = data[j - 1];
//          --j;
//      }
//      data[low] = temp;
//  }
//}
//
///*--------------------希尔排序---------------------*/
//void shellSort(int * data, int n) 
//{
//  int step, i, j, key;
//  将数组按照step分组,不断二分到每组只剩下一个元素
//  for (step = n / 2; step>0; step /= 2)
//  {
//      将每组中的元素排序,小的在前
//      for (i = step; i<n; i++) 
//      {
//          key = data[i];
//          for (j = i - step; j >= 0 && key<data[j]; j -= step)
//          {
//              data[j + step] = data[j];
//          }
//          和上面的for循环一起,将组中小的元素换到数组的前面
//          data[j + step] = key;
//      }
//  }
//}
//
///*--------------------选择排序---------------------*/
//void selectSort(int data[], int n) 
//{
//  int i, j, mix, temp;
//  每次循环数组,找出最小的元素,放在前面,前面的即为排序好的
//  for (i = 0; i<n - 1; i++) {
//      假设最小元素的下标
//      int mix = i;
//      将上面假设的最小元素与数组比较,交换出最小的元素的下标
//      for (j = i + 1; j<n; j++)
//      {
//          if (data[j] < data[mix]) 
//          {
//              mix = j;
//          }
//      }
//      若数组中真的有比假设的元素还小,就交换
//      if (i != mix) 
//      {
//          temp = data[i];
//          data[i] = data[mix];
//          data[mix] = temp;
//      }
//  }
//}
//
///*--------------------堆排序---------------------*/
//堆排序将数组先组成二叉树,默认从数组的data[1]开始排,data[0]是
//无效数据
//void heapSort(int data[], int n) 
//{
//  int i;
//  先将数组组成一棵完全二叉树
//  从2/n开始,就是从倒数第二排结点往前开始
//  for (i = n / 2; i>0; i--)
//  {
//      heapAdjust(data, i, n);
//  }
//  循环每个结点,将大的结点交换到堆顶
//  for (i = n; i>1; i--) 
//  {
//      swap(data, 1, i);
//      每次交换完都要调整二叉树,将剩下的最大的结点交换到堆顶
//      heapAdjust(data, 1, i - 1);
//  }
//}
//交换函数
//void swap(int data[], int i, int j)
//{
//  int temp;
//  temp = data[i];
//  data[i] = data[j];
//  data[j] = temp;
//}
//void heapAdjust(int data[], int i, int n) 
//{
//  int j, temp;
//  假设第一个结点的元素是最大的
//  temp = data[i];
//  i结点:2*i是i结点的左结点,2*i+1是i结点的右结点
//  把结点元素大的交换到前面
//  for (j = 2 * i; j <= n; j *= 2) {
//      if (j < n && data[j] < data[j + 1])
//      {
//          j++;
//      }
//      if (temp >= data[j]) 
//      {
//          break;
//      }
//      data[i] = data[j];
//      i = j;
//  }
//  data[i] = temp;
//}
//
///*--------------------归并排序---------------------*/
//void mergeSort(int data[], int first, int last) 
//{
//  int mid = 0;
//  将数组不停的二分分组再组合,直到每组只剩一个元素
//  if (first < last) 
//  {
//      mid = (first + last) / 2;
//      mergeSort(data, first, mid);
//      mergeSort(data, mid + 1, last);
//      merge(data, first, mid, last);
//  }
//  return;
//}
//void merge(int data[], int low, int mid, int high) 
//{
//  int i, k;
//  定义一个临时数组存放传进来的无序数组排好序之后的数组
//  int *temp = (int *)malloc((high - low + 1)*sizeof(int));
//  将无序数组分成两个序列
//  int left_low = low;
//  int left_high = mid;
//  int right_low = mid + 1;
//  int right_high = high;
//  将两个序列比较排序,小的排前
//  for (k = 0; left_low <= left_high && right_low <= right_high; k++)
//  {
//      if (data[left_low] <= data[right_low]) 
//      {
//          temp[k] = data[left_low++];
//      }
//      else{
//          temp[k] = data[right_low++];
//      }
//  }
//  左序列如果有剩下元素未排序,加到临时数组的末尾
//  if (left_low <= left_high) 
//  {
//      for (i = left_low; i <= left_high; i++) 
//      {
//          temp[k++] = data[i];
//      }
//  }
//  右序列如果有剩下元素未排序,加到临时数组的末尾
//  if (right_low <= right_high) 
//  {
//      for (i = right_low; i <= right_high; i++)
//      {
//          temp[k++] = data[i];
//      }
//  }
//  将排好序的小分组转移到原数组中
//  for (i = 0; i<high - low + 1; i++)
//  {
//      data[low + i] = temp[i];
//  }
//  free(temp);
//  return;
//}
///*--------------------基数排序---------------------*/
//该函数的作用是找出num的pos位数的数字(比如:23的个位数数字是3)
//int getNumPos(int num, int pos)
//{
//  int i;
//  int temp = 1;
//  for (i = 0; i<pos - 1; i++) 
//  {
//      temp *= 10;
//  }
//  return (num / temp) % 10;
//}
//void radixSort(int data[], int n)
//{
//  int i, j, k, pos, num, index;
//  这几句话是创建一个从0-9(行)× (n+1)(列)的网格,第一列从上往下是0-9,
//  第二列是该行包含的元素个数,默认为0个
//  int *radixArrays[10];
//  for (i = 0; i<10; i++) 
//  {
//      radixArrays[i] = (int *)malloc(sizeof(int)* (n + 1));
//      radixArrays[i][0] = 0;
//  }
//  pos最大为31为数,计算机能承受的最大范围了
//  for (pos = 1; pos <= 31; pos++) 
//  {
//      该for循环是将数组的元素按照位数(pos)的值放进网格内
//      for (i = 0; i<n; i++)
//      {
//          num = getNumPos(data[i], pos);
//          index = ++radixArrays[num][0];
//          radixArrays[num][index] = data[i];
//      }
//      该for循环是将上面的for循环已经按照某个位数(pos)排列好的元素存入数组
//      for (i = 0, j = 0; i<10; i++)
//      {
//          for (k = 1; k <= radixArrays[i][0]; k++) 
//          {
//              data[j++] = radixArrays[i][k];
//          }
//          清空网格,以便给下个位数排列
//          radixArrays[i][0] = 0;
//      }
//  }
//}
//费式搜寻
//#include<stdio.h>
//#include<stdlib.h>
//#include<time.h>
//#define MAX 15
//#define SWAP(x,y){int t;t=x;x=y;y=t;}
//
//void createfib(void);//建立费事数列
//int findx(int, int);//找x值
//int fibsearch(int[], int);//费式搜寻
//void quicksort(int[], int, int);//快速排序
//
//int Fib[MAX] = { -999 };
//
//int main(void)
//
//{
//  int number[MAX] = { 0 };
//  int i,find;
//  srand(time(NULL));
//  for (i = 1; i <= MAX; i++)
//  {
//      number[i] = rand() % 100;
//  }
//  quickSort(number, 1, MAX);
//  printf("数列:");
//  for (i = 1; i <= MAX; i++)
//
//      printf("%d", number[i]);
//  printf("\n输入寻找对象:");
//  scanf("%d", &find);
//  if ((i = fibsearch(number, find)) >= 0)
//      printf("找到数字于索引 %d", i);
//  else
//      printf("\n找不到指定数");
//  printf("\n");
//  return 0;
//  
//
//}
////建立费事数列
//void createfib(void)
//{
//  int i;
//  Fib[0] = 0;
//  Fib[1] = 1;
//  for (i = 2; i < MAX; i++)
//      Fib[i] = Fib[i - 1] + Fib[i - 2];
//}
////找x值
//int findx(int n, int find)
//{
//  int i = 0;
//  while (Fib[i] <= n)
//      i++;
//  i--;
//  return i;
//}
////费式搜寻
//int fibsearch(int number[], int find)
//{
//  int i, x, m;
//  createfib();
//  x = findx(MAX + 1, find);
//  m = MAX - Fib[x];
//  printf("\n=%d,m=%d,Fib[x]=%d\n\n", x, m, Fib[x]);
//  x--;
//  i = x;
//  if (number[i] < find)
//      i += m;
//  while (Fib[x]>0)
//  {
//      if (number[i] < find)
//          i += Fib[--x];
//      else if (number[i]>find)
//          i -= Fib[--x];
//      else
//          return i;
//  }
//  return -1;
//
//
//}
//void qiucksort(int number[], int left, int right)
//{
//  int i, j, k, s;
//  if (left < right)
//  {
//      s = number[(left + right) / 2];
//      i = left - 1;
//      j = right + 1;
//      while (1)
//      {
//          while (number[++i] < s);
//          while (number[--j]>s);
//          if (i>j)
//              break;
//          SWAP(number[i], number[j]);
//      }
//      quickSort(number, left, i - 1);
//      qiucksort(number, j + 1, right);
//  }
//}
//稀疏矩阵
//#include<stdio,h>
//#include<stdlib,h>
//
//int main(void)
//{
//  int num[5][3] = { { 5, 6, 4 }, { 1, 1, 3 }, { 2, 3, 6 }, { 3, 2, 9 }, { 4, 4, 12 } };
//  int i, j, k = 1;
//
//  printf("sparse matrix:\n");
//  for (i = 0; i < 5; i++)
//  {
//      for (j = 0; j < 3; j++)
//      {
//          printf("%4d", num[i][j]);
//      }
//      putchar("\n");
//  }
//  printf("\nmatrix还原:\n");
//  for (i = 0; i < num[0][0]; i++)
//  {
//      for (j = 0; j < num[0][1]; j++)
//      {
//          if (k < num[0][2] && i == num[k][0] && j == num[k][1])
//          {
//              printf("%4d", num[k][2]);
//              k++;
//          }
//          else
//              printf("%4d", 0);
//      }
//      putchar("\n");
//  }
//  return 0;
//}

//八皇后
//#include<stdio,h>
//#include<stdlib.h>
//#define N 8
//
//int column[N + 1];
//int rup[2 * N + 1];
//int lup[2 * N + 1];
//int queen[N + 1] = { 0 };
//int num;
//
//void backtrack(int);
//
//int main(void)
//{
//
//  int i;
//  num = 0;
//  for (i = 1; i <= N; i++)
//      column[i] = 1;
//
//  for (i = 1; i <= 2 * N; i++)
//      rup[i] = lup[i] = 1;
//
//  backtrack(1);
//
//  return 0;
//
//}
//void showAnswer()
//{
//  int x, y;
//  printf("\n解答%d\n", ++num);
//  for (y = 1; y <= N; y++)
//  {
//      for (x = 1; x <= N; x++)
//      {
//          if (queen[y] == x)
//          {
//              printf("Q");
//          }
//          else
//          {
//              printf(".");
//          }
//      }
//      printf("\n");
//  }
//}
//void backtrack(int i)
//{
//  int j;
//
//  if (i > N)
//  {
//      showAnswer();
//  }
//  else
//  {
//      for (j = 1; j <= N; j++)
//      {
//          if (column[j] == 1 && rup[i + j] == 1 && lup[i - j + N] == 1)
//          {
//              queen[i]=j;
//
//              column[j] = rup[i + j] = lup[i - j + N] = 0;
//              backtrack(i + 1);
//              column[j] = rup[i + j] = lup[i - j + N] = 1;
//          }
//      }
//  }
//}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值