1. 首页 > 科技

数据结构链表操作算法题目? 创建链表数据结构对象

数据结构链表操作算法题目?创建链表数据结构对象

数据结构单链表的题目 希望有高人帮忙解答 谢谢!

为了提高效率,最后采用了下面的算法。

思路如下:

1.首先将单链表调整为前半部分为奇数,后半部分为偶数的序列;

2.扫描链表,找到分界,拆分成两个子链表;

3.对奇偶子链表排序;

其中第一步算法:

 从头开始扫描,p指像当前节点,q指向后继;

1.若p->data为奇数,则继续后移;

2.若p->data为偶数,

  (1)当q->data为偶数时,q指针后移,P不变,直到找到一个奇数为止,此时Q节点为找到奇数节点;这时,可交换P和Q节点的Data域,p和Q均后移一步;

   (2)当q->data为奇数时,q指针后移,P不变,直到找到一个偶数数为止,此时Q节点为找到偶数的前驱节点;这时,可交换P和Q节点(偶数的前驱节点)的Data域,p指向Q,Q后移;       

下面为程序代码:(采用无头节点链表)

void AdjustList(LinkList &L){ 

 //把单链表调整为前半部分为奇数,后半部分为偶数的单链表的调整函数。

 LinkList p,q;

 int temp;

 p=L->next;

 q=p->next;

 while(q){

   if(p->data%2==1)

   {

  p=q;

  q=q->next;

   }

   else{

      temp=q->data%2;

      switch(temp)

      {

      case 0:

        while(q&&q->data%2==0)

      q=q->next;

        if(q){

              Swap(p->data,q->data);

           p=p->next;

           q=q->next;

        }

        break;

     case 1:

        while(q&&(q->data%2==1)&&(q->next)

      &&((q->next)->data)%2!=0)

        q=q->next;

        if(q){

            Swap(p->data,q->data);

            p=q;

            q=q->next;

        }

       break;

     default:  ;

    } 

    }

 }

 printf("\n Out the Adjust whole List:");

 Print_L(L);

 

void SpiltList(LinkList &L,LinkList &L1,LinkList &L2){

 //找到奇数序列与偶数序列的分界,直接拆分的函数;

 LinkList p,q;

 p=L;

 q=p->next;

 while(q&&q->data%2!=0){

  p=q;

  q=q->next;

 }

 L2=p->next;

 p->next=NULL;

 L1=L;  

void  Sort(LinkList &L){

 //对链表排序;

 LinkList p,q,min; 

 for(p=L;p->next!=NULL;p=p->next){

  min=p;

  for(q=p->next;q!=NULL;q=q->next)

   if(q->datadata)

    min=q;

     Swap(p->data,min->data);

 }

}

我这有完整运行程序,只给你关键的模块,对于你的问题,这三个函数足够了,希望你能得到你想要的东西,ok!

关于数据结构的一个链表题

你的程序错误太多,我编写的源程序发给你,希望对你有帮助:

请参考我的 :

#include"stdio.h"

#include"stdlib.h"

struct Node

{

int data;

struct Node *next;

};

typedef struct Node Stack_Node;

typedef Stack_Node *Linked_Stack;

Linked_Stack top=NULL;

int isEmpty(void)

{

if (top==NULL) return 1;

else return 0;

}

void push(int data)

{

Linked_Stack new_add_node;

new_add_node=(Stack_Node *)malloc(sizeof(Stack_Node));

new_add_node->data=data;

new_add_node->next=top;

top=new_add_node;

}

int pop(void)

{

Linked_Stack ptr;

int temp;

if (isEmpty())

{

printf("Stack_Node NULL!\n");

return -1;

}

else

{

ptr=top;

top=top->next;

temp=ptr->data;

free(ptr);

return temp;

}

}

void main()

{

int value;

int i,n;

printf("Input n>=0 :");

scanf("%d",&n);

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

{

printf("Stack_node'%d':",i);

scanf("%d",&value);

push(value);

}

printf("\n===================================\n");

printf("chu zai sun xun:");

while (!isEmpty())

printf("%d,",pop());

printf("\n=====================================\n");

printf("\n");

}

^-^

《数据结构》实验题目 实验一 编程实现链表的创建、插入、删除和查找算法

/***

*DynaLnkList.cpp - 动态链表,即顺序表的动态链式存储实现

* 这是我根据书上给的存储结构及函数头编的几个,如有错误

*还请指教

****/

#include <stdlib.h>

#include <malloc.h>

#include <memory.h>

#include <assert.h>

#include "DynaLnkList.h"

/*------------------------------------------------------------

操作目的: 初始化链表

初始条件: 无

操作结果: 构造一个空的线性表

函数参数:

LinkList *L 待初始化的线性表

返回值:

bool 操作是否成功

------------------------------------------------------------*/

bool InitList(LinkList *L)

{

(*L) = (LinkList)malloc(sizeof(LNode));

if(NULL == *L)

return false;

(*L)->next = NULL;

return true;

}

/*------------------------------------------------------------

操作目的: 销毁链表

初始条件: 线性表L已存在

操作结果: 销毁线性表L

函数参数:

LinkList *L 待销毁的线性表

返回值:

------------------------------------------------------------*/

void DestroyList(LinkList *L)

{

if(NULL != *L)

free(*L);

}

/*------------------------------------------------------------

操作目的: 判断链表是否为空

初始条件: 线性表L已存在

操作结果: 若L为空表,则返回true,否则返回false

函数参数:

LinkList L 待判断的线性表

返回值:

bool 是否为空

------------------------------------------------------------*/

bool ListEmpty(LinkList L)

{

if(NULL == L || NULL == L->next)

return true;

else

return false;

}

/*------------------------------------------------------------

操作目的: 得到链表的长度

初始条件: 线性表L已存在

操作结果: 返回L中数据元素的个数

函数参数:

LinkList L 线性表L

返回值:

int 数据元素的个数

------------------------------------------------------------*/

int ListLength(LinkList L)

{

int len = 0;

while(NULL != L->next)

{

len++;

L = L->next;

}

return len;

}

/*------------------------------------------------------------

操作目的: 得到链表的第i个元素

初始条件: 线性表L已存在,1<=i<=ListLength(L)

操作结果: 用e返回L中第i个数据元素的值

函数参数:

LinkList L 线性表L

int i 数据元素的位置

ElemType *e 第i个数据元素的值

返回值:

bool 操作是否成功

------------------------------------------------------------*/

bool GetElem(LinkList L, int i, ElemType *e)

{

LinkList p;

p = L->next;

int j = 1;

while(p && j<i)

{

p = p->next;

++j;

}

if(!p || j>i)

return false;

*e = p->data;

return true;

}

/*------------------------------------------------------------

操作目的: 得到链表指定元素的位置

初始条件: 线性表L已存在

操作结果: 返回L中第一个与e满足关系compare()的数据元素的位序。

若这样的元素不存在则返回0。

函数参数:

LinkList L 线性表L

ElemType e 数据元素e

int (*fp)() 用于比较相等的函数指针

返回值:

int 与e满足关系compare()的数据元素的位序

------------------------------------------------------------*/

int LocateElem(LinkList L, ElemType e, int (*fp)(ElemType, ElemType))

{

LinkList p = L->next;

int i=1;

while(p != NULL && p->data != e)

{

p=p->next;

i++;

}

if(p==NULL)

{

return 0;

}

else

return i;

}

/*------------------------------------------------------------

操作目的: 得到链表指定元素的前驱

初始条件: 线性表L已存在

操作结果: 若cur_e是L的数据元素,且不是第一个,则用pre_e返回

它的前驱,否则操作失败,pre_e无定义

函数参数:

LinkList L 线性表L

ElemType cur_e 数据元素cur_e

ElemType *pre_e 前驱数据元素

返回值:

bool 操作是否成功

------------------------------------------------------------*/

bool PriorElem(LinkList L, ElemType cur_e, ElemType *pre_e)

{

LinkList p = L->next;

int i = 0;

while(p != NULL && p->data != cur_e)

{

p = p->next;

i++;

}

for(i;i>0;i--)

{

p->next;

}

*pre_e = p->data;

return true;

if(p = NULL)

return false;

}

/*------------------------------------------------------------

操作目的: 得到链表指定元素的后继

初始条件: 线性表L已存在

操作结果: 若cur_e是L的数据元素,且不是最后一个,则用nxt_e返

回它的后继,否则操作失败,nxt_e无定义

函数参数:

LinkList L 线性表L

ElemType cur_e 数据元素cur_e

ElemType *nxt_e 后继数据元素

返回值:

bool 操作是否成功

------------------------------------------------------------*/

bool NextElem(LinkList L, ElemType cur_e, ElemType *nxt_e)

{

LinkList p = L->next;

int i = 2;

while(p != NULL && p->data != cur_e)

{

p = p->next;

i++;

}

for(i;i>0;i--)

{

p->next;

}

*nxt_e = p->data;

return true;

if(p = NULL)

return false;

}

/*------------------------------------------------------------

操作目的: 遍历链表

初始条件: 线性表L已存在

操作结果: 依次对L的每个元素调用函数fp

函数参数:

LinkList L 线性表L

void (*fp)() 访问每个数据元素的函数指针

返回值:

------------------------------------------------------------*/

void ListTraverse(LinkList L, void (*fp)(ElemType))

{

if(L->next != NULL)

{

LinkList p=L->next;

while(p)

{

(*fp)(p->data);

p=p->next;

}

}

}

/*------------------------------------------------------------

操作目的: 清空链表

初始条件: 线性表L已存在

操作结果: 将L置为空表

函数参数:

LinkList L 线性表L

返回值:

------------------------------------------------------------*/

void ClearList(LinkList L)

{

LinkList p;

while(L->next)

{

p=L->next;

L->next=p->next;

free(p);

}

}

/*------------------------------------------------------------

操作目的: 在链表的指定位置插入结点,插入位置i表示在第i个

元素之前插入

初始条件: 线性表L已存在,1<=i<=ListLength(L) + 1

操作结果: 在L中第i个位置之前插入新的数据元素e,L的长度加1

函数参数:

LinkList L 线性表L

int i 插入位置

ElemType e 待插入的数据元素

返回值:

bool 操作是否成功

------------------------------------------------------------*/

bool ListInsert(LinkList L, int i, ElemType e)

{

int j = 0;

LinkList p;

while(j<i-1 && j!=NULL)

{

j++;

L=L->next;

}

if(NULL == L)

return false;

p = (LinkList)malloc(sizeof(LNode));

if(!p)

return false;

p->data = e;

p->next = L->next;

L->next = p;

return true;

}

/*------------------------------------------------------------

操作目的: 删除链表的第i个结点

初始条件: 线性表L已存在且非空,1<=i<=ListLength(L)

操作结果: 删除L的第i个数据元素,并用e返回其值,L的长度减1

函数参数:

LinkList L 线性表L

int i 删除位置

ElemType *e 被删除的数据元素值

返回值:

bool 操作是否成功

------------------------------------------------------------*/

bool ListDelete(LinkList L, int i, ElemType *e)

{

LinkList p;

LinkList q;

p = L;

int j = 0;

while(p->next && j<i-1)

{

p = p->next;

++j;

}

if(!p->next || j>i-1)

return false;

q = p->next;

p->next = q->next;

*e = q->data;

free(q);

return true;

}

有关c语言链表的题。。期末了,很捉急啊,求大家帮忙!!!!给定一个空链表,请按如下命令进行操作。

随便手写下玩玩。

int *v, *k, *l, n, h;

if ( scanf( "%d", &n ) > 0 && n > 0 ) {

int i, j, c = n;

v = calloc( c, sizeof(int) );

k = calloc( c, sizeof(int) );

l = calloc( c, sizeof(int) );

for ( i=0, h=0; i<c; i++ ) {

char r[10];

if ( scanf( "%s", r ) < 1 )

break;

if ( r[0] == 'Q' ) {

for ( j = h; j > 0; j = l[j-1] )

printf( "%d ", k[j-1] );

printf( "\n" );

} else if ( r[0] == 'A' || r[0] == 'D' ) {

int x, p;

scanf( "%d", &x );

if ( r[0] == 'A' ) {

int a;

for ( j = h, p = 0; j > 0; p = j, j = l[j-1] ) {

if ( k[j-1] < x )

continue;

for ( a = 0; a < c && v[a]; ++a )

;

k[a] = x, l[a] = j, v[a] = 1, ++a;

if ( p == 0 )

h = a;

else

l[p-1] = a;

break;

}

} else {

for ( j = h, p = 0; j > 0; p = j, j = l[j-1] ) {

if ( k[j-1] < x )

continue;

else if ( k[j-1] > x )

break;

if ( p == 0 )

h = l[j-1];

else

l[p-1] = l[j-1];

v[j-1] = 0;

break;

}

}

} else

break;

}

free( v );

free( k );

free( l );

}