设计一个算法,在带头结点的单链表head中删除一个data域值最小的结点,设结点唯一(要算法完整的C语言)

如题所述

第1个回答  2012-09-27
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void InitList(LinkList *L);
void ListDeleteMax(LinkList L,int *e);
int ListInsert(LinkList L,int i,int e);
void DestroyList(LinkList L);
void ListTraverse(LinkList L);
int main(void)
{
LinkList L;
int i,j,m;
int a[]={6,5,4,3,2,1};
InitList(&L);
for(i=0; i<6; ++i)
m = ListInsert(L,i+1,a[i]);
printf("链表的内容为:");
ListTraverse(L);
ListDeleteMax(L,&j);
printf("删除最大元素%d后,链表的内容为:",j);
ListTraverse(L);
DestroyList(L);
return 0;
}
void InitList(LinkList *L)
{
*L = (LinkList )malloc(sizeof(LNode));
if(!*L)
exit(-1);
(*L)->next = NULL;
}
int ListInsert(LinkList L,int i,int e)
{
int j=0;
LinkList p = L;
LinkList s;
while(p&&j<i-1)
{
p = p->next;
j++;
}
if(!p || j>i-1)
{
return 0;
}
s = (LinkList)malloc(sizeof(LNode));
s ->data = e;
s->next = p->next;
p->next = s;
return 1;
}
void ListDeleteMax(LinkList L,int *e) //删除最大元素
{
LinkList p = L->next;
LinkList s = L; //s指向最大结点前面的结点
LinkList q;
int m = p->data; //m保存最大的值
while(p->next)
{
q=p->next;
if(q->data > m)
{
m = q->data;
s = p;
}
p=p->next;
}
q = s->next;
s->next = q->next;
*e = q->data;
free(q);
}
void DestroyList(LinkList L)
{
LinkList q;
while(L)
{
q = L->next;
free(L);
L = q;
}
}
void ListTraverse(LinkList L)
{
LinkList p = L->next;
while(p)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}本回答被提问者和网友采纳

设计一个算法,在带头结点的单链表head中删除一个data域值最小的结点...
void ListDeleteMax(LinkList L,int *e) \/\/删除最大元素 { LinkList p = L->next;LinkList s = L; \/\/s指向最大结点前面的结点 LinkList q;int m = p->data; \/\/m保存最大的值 while(p->next){ q=p->next;if(q->data > m){ m = q->data;s = p;} p=p->ne...

设计一个在带头结点的单链表中删除第i个结点的算法
\/\/删除节点 删除第i个节点int Delete_Positon_LL(LinkList *phead,int i){LinkList p,q;\/\/p为值是x的节点,q是p的前一个节点int j;if((*phead)->next == NULL)\/\/如果链表为空,做下溢处理{printf("单链表为空!\\n");return 0;}if(i == 1) \/\/如果是表头,表头后移{ p=(*phead)...

试写一算法在带头结点的单链表结构上实现线性表操作Length(L)。下面各...
intListLength_L(LinkList &L){int i=0;\/\/i存储链表长度,初始为0LinkList p=L;\/\/p为链表的指针,初始为头指针,指向头结点if(p) p=p-next;\/\/如果p指向的头结点不为空,p指向带数据的第一个结点while(p){\/\/如果p非空,i长度加1,且指向下一个结点p=p->next;i++;} return i;\/\/...

带头结点的单链表,其长度存放在头结点的数据域中,设计一算法求倒数第...
设单链表的长度为n,要查找表中第i个结点(即你要确定的第K个位置),仅当1≦i≦n时,i的值是合法的。但有时需要找头结点的位置,故我们将头结点看做是第0 个结点,其算法如下:Listnode * getnode(linklist head , int i){ int j;listnode * p;p=head;j=0;while(p–>next && j<I...

设计一个算法,遍历单链表求在单链表中找出最小的结点?
首先让指针指向单链表的首节点,然后首节点的地址赋值给指针变量Min,然后用打擂台的方法不断地找下一个节点,如果新结点的值小于最小值就更新最小节点的地址,直到单链表结束就可以输出最小值了

带表头结点的单链表,其结点的元素值以非递减有序排列,编写一个算法删除...
void substract(Node & h)\/\/h是头结点{ Node * p = h.next;\/\/p指向第一个元素节点 while(p && p->next){\/\/p不是最后一个元素节点 if(p->data == p->next->data){\/\/p和下一个节点数据相等,则删除下一节点 Node * temp = p->next; p->next = temp->next; ...

已知一个带有表头结点的单链表,结点结构为(info,next),假设该链表只给...
代码如下:\/\/删除值最小结点 void RemoveminNode(Node *&head){ \/\/找到节点最小节点 int min = head->info; \/\/暂定最小值为head的,如果head为空值的话,此处可改为head->next->info Node *curr = head->next; \/\/记录当前搜索的结点 Node *pre = head; \/\/记录当前搜索的前一个结点 ...

编写一个算法,删除单链表L(L中元素值各不相同)的最大值所对应的结点,并...
voidRemove(LinkListL,DataTypex)\/\/设L是带头结点的单链表{Node*p=L,*q;while(p->next!=NULL&&p->next->data!=x)p=p->next;if(p->next!=NULL){q=p->next;p->next=q->next;deleteq;}}

数据结构 设计一个算法判定一个带头结点的单链表的元素值是否递增的
ElemType data; \/\/数据域 Struct LNode *next;\/\/指针域 }LNode,*Linklist 算法这样写:status Judge (Linkedlist l)\/\/表头为l {int *p,p=l->next;\/\/定义指针变量p,使得p指向首元 if (p-next==NULL||p==NULL) return INFEASIBLE;\/\/如果链表为空,或者仅有一个数据节点,则参数不...

1. 请编写一个算法,删除单链表中值相同的多余结点,使得最后得到的链表...
p=null) or (p.next=null)时间为O(n*n) 空间O(1)还有一种算法 设一个指针p 数组 hash[1..maxnumber] as type byte p<-head repeat { if (hash[p.data]=1 ) { k<-p.next;del(p);p<-k;} else {hash[p.data]<-1; p<-p.next} }until p=null 时间为O(n) 空间O(m)

相似回答