Chinaunix首页 | 论坛 | 博客
  • 博客访问: 122018
  • 博文数量: 32
  • 博客积分: 506
  • 博客等级: 下士
  • 技术积分: 257
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-11 11:06
文章分类

全部博文(32)

文章存档

2012年(32)

分类: C/C++

2012-10-22 20:00:59

1,单链表类型描述:

点击(此处)折叠或打开

  1. typedef char DateType;

  2. typedef struct node{
  3.     DateType data;
  4.     struct node *next;
  5. }ListNode, *LinkList;

  6. LinkList p,head;

2,建立单链表,并以换行符'\n'为输入条件结束标志符:
  (1)头插法建表:将新的节点插入当前链表的表头上

点击(此处)折叠或打开

  1. LinkList CreatListF(void)
  2. {
  3.     char ch;
  4.     LinkList p = NULL,head = NULL;
  5.     ch = getchar();

  6.     while(ch !=\n’)
  7.     {
  8.         p = (LinkList)malloc(sizeof(ListNode));
  9.         p->data = ch;
  10.         p->next = head;
  11.         head = p;
  12.        
  13.         ch = getchar();
  14.     }
  15.   
  16.     return head;
  17. }
   (2)尾插法建表:将新节点插入到当前链表的表尾上

点击(此处)折叠或打开

  1. LinkList CreatListT(void)
  2. {
  3.     char ch;
  4.     LinkList head = NULL;
  5.     Linklist p = NULL,T = NULL;//T始终指向链表尾节点指针

  6.     ch = getchar();
  7.     while(ch != "\n")
  8.     {
  9.         p = (LinkList)malloc(sizeof(ListNode));
  10.         p->data = ch;
  11.         if(head == NULL)
  12.         {
  13.             head = p;//空表插入第一个新节点  
  14.         }
  15.         else
  16.         {
  17.             T->next = p; //将第二个之后的新节点放入*T之后
  18.         }
  19.         T = P;
  20.         ch = getchar();
  21.     }
  22.     if(T != NULL)
  23.     {
  24.         T->next = NULL; ////尾节点指针域应被置空   
  25.     }
  26.    
  27.     return head;
  28. }
3,单链表的查找运算:
(1)按序号查找
//在带头结点的单链表head中查找第i个结点,若找到(0≤i≤n),则返回该结点的存储位置,否则返回NULL,头结点可看做是第0个结点。

点击(此处)折叠或打开

  1. ListNode* GetNode(LinkList head,int i)
  2. {
  3.     int j;
  4.     LinkList p = NULL;
  5.     
  6.     p = head;
  7.     j = 0; //从头结点开始查找
  8.    
  9.     while((p->next != NULL) && (j < i))
  10.     {
  11.         p = p->next;
  12.         j++;
  13.     }
  14.     if(i == j)
  15.     {
  16.         return p; //找到
  17.     }
  18.     else
  19.         return NULL; // 没有找到
  20.     
  21. }
(2)按值查找:
从开始结点出发,顺着链逐个将结点的值和给定值key作比较,若有结点的值与key相等,则返回首次找到的其值为key的结点的存储位置;否则返回NULL。

点击(此处)折叠或打开

  1. ListNode* LocateNode(LinkList head,DataType key)
  2. {
  3.     ListNode *p = head->next;
  4.     while((p != NULL) && (p->data != key))
  5.     {
  6.         p = p->next;
  7.     }
  8.     return p;

  9. }
4,单链表的插入运算:
插入运算是将值为x的新结点插入到表的第i个结点的位置上,即插入到ai-1与ai之间,
实现:将值为x的新结点插入到带头结点的单链表head的第i个结点的位置上

点击(此处)折叠或打开

  1. void InsertList(LinkList head,DataType x,int i)
  2. {
  3.     ListNode *P;
  4.     ListNode *NewNode;
  5.    
  6.     P = GetNode(head,i-1);//第i-1节点
  7.     if(p == NULL)
  8.        Error("position error\n");错误退出
  9.    
  10.     NewNode = (ListNode*)malloc(sizeof(ListNode));   
  11.     p->next = NewNode;
  12.     NewNode->next = p->next;
  13.     NewNode->data = x;
  14.    
  15. }
5,单链表的删除运算:
删除运算是将表的第i个结点删去,实例:/删除带头结点的单链表head上的第i个结点

点击(此处)折叠或打开

  1. void DeleteList(LinkList head,int i)
  2. {
  3.     ListNode *p,*DeleteNode;
  4.   
  5.     p = GetNode(head,i-1);//获取i-1节点
  6.     if((p == NULL) && (p->next == NULL)) //考虑尾节点
  7.     Error("position error\n"); //错误退出
  8.     DeleteNode = p->next;
  9.     p->next = DeleteNode->next;
  10.     free(p);//释放内存空间  

  11. }





 


 
 

 
 
阅读(1340) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~