C语言链表

来源:互联网 发布:拍照解题软件下载 编辑:程序博客网 时间:2024/05/16 07:57
 

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


/*构建结点结构体 */
typedef struct LNode{
 int data;
 struct LNode * next;
}LNode, * LinkList;
/*用于创建链表的函数 */
/*反序构建的*/
LinkList CreateList_L(LinkList L, int n)
{
 int i;
 LinkList p;
 L = (LinkList)malloc(sizeof(LNode));
 L->next = NULL;
 for(i = n; i > 0; --i)
 {
  p = (LinkList)malloc(sizeof(LNode));
  scanf("%d",&p->data);
  p->next = L->next;
  L->next = p;
 }
 return L;
}
/* 用于插入结点的函数 */

LinkList ListInsert_L(LinkList L, int i, int newnode)
{
 LinkList p = L;
 LinkList s;
 int j = 0;
 while(p&&j<i-1)
 {
  p = p->next;
  ++j;
 }
 if(!p||j>i-1)
 {
  printf("位置小于1或大于表长。\n");
  return L;
 }
 s = (LinkList)malloc(sizeof(LNode));
 s->data = newnode;
 s->next = p->next;
 p->next = s;
 return L;
 
}

/* 用于删除结点的函数 */

LinkList ListDelete_L(LinkList L, int i)
{
 LinkList p = L;
 LinkList s;
 int j=0;
 while(p->next&&j<i-1)
 {
  p = p->next;
  ++j;
 }
 if(!(p->next)||j>i-1)
 {
  printf("删除位置不合理。\n");
  return L;
 }
 s = p->next;
 p->next = s->next;
 printf("%s%d\n","被删除的结点是:",s->data);
 free(s);
 return L;
}


/*用于遍历链表的函数 */
void ListDisp_L(LinkList L)
{
 LinkList p;
 int i=0;
 p = L->next;
 
 while(p)
 {
  printf("%d:%d\n", ++i,p->data);
  p = p->next;
 }
 
}


/* 选择排序算法 网上找来的 我自己写的老报错误 */

LinkList ListSort_L(LinkList L)
{
 LinkList h1,p,q,r,s;
 h1=p=(LinkList)malloc(sizeof(LinkList));
 p->next=L;
 while(p->next)
 {
  q=p->next;
  r=p;
  while(q->next)
  {
   if(q->next->data < r->next->data)
    r=q;
   q=q->next;
  }
  if(r!=p)
  {
   s=r->next;
   r->next=s->next;
   s->next=p->next;
   p->next=s;
  }
  p=p->next;
 }
 L=h1->next;
 free(h1);
 return L;
}

int getoptions()
{
 int opt;
 printf("1: 录入链表\n");
 printf("2: 显示链表\n");
 printf("3: 插入结点\n");
 printf("4: 删除结点\n");
 printf("5: 排序链表\n");
 printf("6: 退出\n");
 printf("输入选项并按回车确认:");
 scanf("%d",&opt);
 return opt;
}

 

int main(int argc, char* argv[])
{
 int opt;
 int where;
 int value;
 int count;
 LinkList L;
 while(1)
 {
  opt = getoptions();
  if(opt == 1)
  {
   printf("请输入链表初始结点数:");
   scanf("%d",&count);
   printf("请输入各个结点数值,每输入一个按回车确认:\n");
   L = CreateList_L(L, count);
   ListDisp_L(L);
   system("PAUSE");
   continue;
  }
  if(opt == 2)
  {
   ListDisp_L(L);
   system("PAUSE");
   continue;
  }
  if(opt == 3)
  {
   ListDisp_L(L);
   printf("请输入插入位置:");
   scanf("%d", &where);
   printf("请输入要插入的数值:");
   scanf("%d", &value);
   L = ListInsert_L(L,where,value);
   ListDisp_L(L);
   system("PAUSE");
   continue;
  }
  if(opt == 4)
  {
   ListDisp_L(L);
   printf("请输入要删除的位置:");
   scanf("%d",&where);
   L = ListDelete_L(L,where);
   ListDisp_L(L);
   system("PAUSE");
   continue;
  }
  if(opt == 5)
  {
   L = ListSort_L(L);
   ListDisp_L(L);
   system("PAUSE");
   continue;
  }
  if(opt == 6)
  {
   return 0;
  }
  
 }  
 
}

原创粉丝点击