数据结构链表

来源:互联网 发布:艾默生网络能源年终奖 编辑:程序博客网 时间:2024/06/04 18:30
 正文代码:
#include <stdio.h>

#include <malloc.h>

typedef int DataType;

 

#include "LinList.h"

void Combine(SLNode *head1, SLNode *head2);

 

void InsertSort(int a[], int n);

 

void main(){

         SLNode*head1, *head2;

         DataType *p, *q;

 

         int x, i, m = 0, n = 0;

        

         ListInitiate(&head1);

         ListInitiate(&head2);

 

         //建立第一个链表接收从键盘输入的数据

         printf("请输入任意个数的据元素完成第一个链表:\n");

         while(scanf("%d", &x))

         {

                   ListInsert(head1,m, x);

                   m++;

         }

                   printf("\n");

 

         //建立第二个链表接收从键盘输入的链表数据

         printf("请输入任意个数的数据元素完成第二个链表:\n");

         getchar();

         while(scanf("%d",&x))

         {

                   ListInsert(head2,n, x);

                   n++;

         }

 

         //显示当前链表数据元素

         printf("链表一的数据元素为:");

         for(i= 0; i < ListLength(head1); ++i)

         {

         ListGet(head1,i, &x);

         printf("%d ", x);

         }

         printf("\n");

         printf("链表二的数据元素为:");

         for(i= 0; i < ListLength(head2); ++i)

         {

         ListGet(head2,i, &x);

         printf("%d ", x);

         }

         printf("\n");

 

         //合成两个链表

         Combine(head1,head2);

        

}

 

 

void Combine(SLNode *head1,  SLNode *head2)

{

         SLNode*com, *p, *q, *r, *s;

         int i = 0, x;

   DataType *a;

         a= (DataType *)malloc(sizeof(DataType)*(ListLength(head1)+ListLength(head2)));

 

         ListInitiate(&com);

        

 

         r= head1;

         s= head2;

         p= head1->next;

         q= head2->next;

         if(ListLength(head1)>= ListLength(head2))

         {

                  

                   while(q->next!= NULL)

                   {

                            r= p;

                            p= p->next;

                            r->next= q;

                            s= q;

                            q= q->next;

                            s->next= p;

                   }

                   r= p;

                   p= p->next;

                   r->next= q;

                   q->next= p;

 

                   //将以head1为头节点的链表中的数据元素输出

                   printf("将以head1为头节点的链表中的数据元素输出:");

                   for(i= 0; i <ListLength(head1); ++i)

                   {

                            ListGet(head1,i, &x);

                            printf("%d ", x);

                   }

                   printf("\n");

                   //将链表head1数据放入data数组中并排序

                   for(i= 0; i < ListLength(head1); ++i)

                   {

                            ListGet(head1,i, &a[i]);

 

                   }

                   InsertSort(a,ListLength(head1));

 

                   //将排序后的数据元素按序放入新建的链表com中并输出

                   for(i= 0; i < ListLength(head1); ++i)

                            ListInsert(com,i, a[i]);

                   printf("排序后的链表com数据元素分别显示为:");

                   for(i= 0; i < ListLength(com); ++i)

                   {

                            ListGet(com,i, &x);

                            printf("%d ", x);

                   }

                   printf("\n");

        

         }

         else{

                   while(p->next!= NULL)

                   {

                            s= q;

                            q= q->next;

                            s->next= p;

                            r= p;

                            p= p->next;

                            r->next= q;

                   }

                   s= q;

                   q= q->next;

                   s->next= p;

                   p->next= q;

                  

                   //将以head2为头节点的链表中的数据元素输出    

                   printf("将以head2为头节点的链表中的数据元素输出:");

                   for(i= 0; i <ListLength(head2); i++)

                   {

                            ListGet(head2,i, &x);

                            printf("%d ", x);

                   }

                            printf("\n");

                  

 

                   //将链表head2数据放入data数组中并排序

                   for(i= 0; i < ListLength(head2); ++i)

                   {

                            ListGet(head2,i, &a[i]);

 

                   }

                   InsertSort(a,ListLength(head1));

 

                   //将排序后的数据元素按序放入新建的链表com中并输出

                   for(i= 0; i < ListLength(head2); ++i)

                            ListInsert(com,i, a[i]);

                   printf("排序后的链表com数据元素分别显示为:");

                   for(i= 0; i < ListLength(com); ++i)

                   {

                            ListGet(com,i, &x);

                            printf("%d ", x);

                   }

                   printf("\n");}}

 

 

//直接插入排序

 

void InsertSort(DataType a[], int n)

{

         int i, j;

   int temp;

         for(i= 0; i < n-1; i++)

{temp = a[i+1];

                   j= i;

                   while(j> -1&& temp < a[j])

                   {

                            a[j+1]= a[j];

                            a[j]= temp;

                            j--;}}}



























头文件 “linlist.h”
#include <stdlib.h>
typedef int DataType;
#include <malloc.h>
typedef struct Node
{
 DataType data;
 struct Node *next;
} SLNode;

void ListInitiate(SLNode **head)      /*初始化*/
{
 /*如果有内存空间,申请头结点空间并使头指针head指向头结点*/
 if((*head = (SLNode *)malloc(sizeof(SLNode))) == NULL) exit(1);
 (*head)->next = NULL;      /*置链尾标记NULL */
}

int ListLength(SLNode *head)
{
 SLNode *p = head;        /*p指向首元结点*/
 int size = 0;         /*size初始为0*/

 while(p->next != NULL)      /*循环计数*/
 {
  p = p->next;
  size ++;
 }
 return size;
}

int ListInsert(SLNode *head, int i, DataType x)
/*在带头结点的单链表head的数据元素ai(0 ≤ i ≤ size)结点前*/
/*插入一个存放数据元素x的结点*/
{
 SLNode *p, *q;
 int j;

 p = head;         /*p指向首元结点*/
 j = -1;        /*j初始为-1*/
 while(p->next != NULL && j < i - 1)
 /*最终让指针p指向数据元素ai-1结点*/
 {
  p = p->next;
  j++;
 }

 if(j != i - 1)
 {
  printf("插入位置参数错!");
  return 0;
 }

 /*生成新结点由指针q指示*/
 if((q = (SLNode *)malloc(sizeof(SLNode))) == NULL) exit(1);
 q->data = x;

 q->next = p->next;      /*给指针q->next赋值*/
 p->next = q;       /*给指针p->next重新赋值*/
 return 1;
}

int ListDelete(SLNode *head, int i, DataType *x)
/*删除带头结点的单链表head的数据元素ai(0 ≤ i ≤ size - 1)结点*/
/*删除结点的数据元素域值由x带回。删除成功时返回1;失败返回0*/
{
 SLNode *p, *s;
 int j;

 p = head;         /*p指向首元结点*/
 j = -1;        /*j初始为-1*/
 while(p->next != NULL && p->next->next!= NULL && j < i - 1)
 /*最终让指针p指向数据元素ai-1结点*/
 {
  p = p->next;
 j++;
 }

 if(j != i - 1)
 {
  printf("插入位置参数错!");
  return 0;
 }

 s = p->next;      /*指针s指向数据元素ai结点*/
 *x = s->data;     /*把指针s所指结点的数据元素域值赋予x*/
 p->next = p->next->next;  /*把数据元素ai结点从单链表中删除指*/
 free(s);      /*释放指针s所指结点的内存空间*/
 return 1;
}

int ListGet(SLNode *head, int i, DataType *x)
/*取数据元素ai和删除函数类同,只是不删除数据元素ai结点*/
{
 SLNode *p;
 int j;

 p = head;
 j = -1;
 while(p->next != NULL && j < i)
 {
  p = p->next; j++;
 }

 if(j != i)
 {
  printf("取元素位置参数错!");
  return 0;
 }

 *x = p->data;
 return 1;
}

void Destroy(SLNode **head)
{
 SLNode *p, *p1;

 p = *head;
 while(p != NULL)
 {
  p1 = p;
  p = p->next;
  free(p1);
 }
 *head = NULL;
}

原创粉丝点击