链表练习

来源:互联网 发布:佛山网页美工培训 编辑:程序博客网 时间:2024/05/20 18:43

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

typedef struct Node
{
 int data;
 struct Node * pnext;
}Node, *pnode;

//函数声明
pnode creat_list();
void traverse_list(pnode phead);
void sort_list(pnode);
bool insert_list(pnode,int,int);
bool delete_list(pnode,int,int *);
void swapPairs(pnode phead,pnode p,pnode q);
void insert_list(pnode phead,int pos);

int main(void)
{
 int val;
 pnode phead = NULL;
 phead = creat_list();
 traverse_list(phead);
 //sort_list(phead);
 //insert_list(phead,4,22);
 if(delete_list(phead,4,&val))
 {
  printf("删除成功,删除的元素为:%d\n",val);
 }
 else
 {
  printf("删除失败!删除的元素不存在\n");
 }
 traverse_list(phead);
 //pnode p = NULL;
 //pnode q = NULL;
 //insert_list(phead,4);
 //traverse_list(phead);
 return 0;
}

pnode creat_list(void)        //创建链表
{
 int len;
 int i;
 int val;
 pnode phead = (pnode)malloc(sizeof(Node));   //为头结点开辟空间
 if(phead == NULL)
 {
  printf("分配失败\n");
  return 0;
 }
 pnode ptail = phead;  //定义尾指针并初始化
 ptail->pnext = NULL;  //初始化,避免野指针
 printf("请输入你需要生成的链表结点个数:len=");
 scanf("%d",&len);
 for(i=0;i<len;i++)
 {
  printf("请输入第%d个节点的值",i+1);
  scanf("%d",&val);
  pnode pnew = (pnode)malloc(sizeof(Node));  //动态分配空间,每个新节点的地址为pnew
  if(pnew == NULL)
  {
   printf("分配失败\n");
   return 0;
  }
  pnew->data = val;   //将输入的数据存入节点中
  ptail->pnext = pnew; 
  pnew->pnext = NULL;  //重置,避免野指针
  ptail = pnew;
 }
 return phead;
}

void traverse_list(pnode phead)             //遍历
{
 pnode p = phead->pnext;
 while(p != NULL)
 {
  printf("%d\t",p->data);
  p = p->pnext;
 }
 printf("\n");
 return;
}


void sort_list(pnode phead)            //排序
{
 pnode p1,p2;
 int p;
 for(p1=phead->pnext;p1->pnext;p1 = p1->pnext)
 {
  for(p2=p1->pnext;p2;p2 = p2->pnext)
  {
   if(p1->data > p2->data)
   {
   p = p1->data;
   p1->data = p2->data;
   p2->data = p;
   }
  }
 }
 return;
}
/*
bool insert_list(pnode phead,int pos,int val)   //插入节点第一种方法
{
 int i=0;
 pnode p = phead;
 while(p != NULL && i < pos-1)
 {
  p = p->pnext;
  ++i;
 }
 if(i > pos-1 || p == NULL)
  return false;
 pnode pnew = (pnode)malloc(sizeof(Node));
 if(pnew == NULL)
 {
  printf("动态内存分配失败\n");
  return 0;
 }
 pnew->data = val;
 pnode q = p->pnext;
 p->pnext = pnew;
 pnew->pnext = q;
 return true;
}*/

void insert_list(pnode phead,int pos)     //插入节点第二种方法
{
pnode p;
pnode q = (pnode)malloc(sizeof(Node));
q->pnext = NULL;
int i = 0;
for(p = phead->pnext;p;p = p->pnext)
{
i++;
if(pos == i)
break;
}
printf("请输入要插入的节点的数据:");
scanf("%d",&q->data);
q->pnext = p->pnext;
p->pnext = q;
return;
}

/*
bool delete_list(pnode phead,int pos,int *pval)   //删除节点第一种方法
{
 int i=0;
 pnode p = phead;
 while(p->pnext != NULL && i < pos-1)
 {
  p = p->pnext;
  ++i;
 }
 if(i > pos-1 || p->pnext == NULL)
  return false;
 pnode q = p->pnext;
 *pval = q->data;
 p->pnext = p->pnext->pnext;
 free(q);
 q = NULL;
 return true;
}
*/

bool delete_list(pnode phead,int pos,int *pval)   //删除节点第二种方法
{
 int i=0;
 pnode q = NULL;
 pnode p = phead;
for(p = phead->pnext; p; p = p->pnext)
{
i++;
if(pos-1 == i)
{
q = p->pnext;
break;
}
}
 *pval = q->data;
 p->pnext = p->pnext->pnext;
 free(q);
 q = NULL;
 return true;
}


 

0 0
原创粉丝点击