数据结构链表操作算法题目? 创建链表数据结构对象
- 数据结构单链表的题目 希望有高人帮忙解答 谢谢!
- 关于数据结构的一个链表题
- 《数据结构》实验题目 实验一 编程实现链表的创建、插入、删除和查找算法
- 有关c语言链表的题。。期末了,很捉急啊,求大家帮忙!!!!给定一个空链表,请按如下命令进行操作。
数据结构单链表的题目 希望有高人帮忙解答 谢谢!
为了提高效率,最后采用了下面的算法。
思路如下:
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->data
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 );
}