急求 C语言 关于数剧结构 编程问题
解决时间 2021-07-26 16:54
- 提问者网友:临风不自傲
- 2021-07-25 20:37
假设有一个循环单链表的长度大于1,表表中既无头结点也无头指针.已知S为指向链表中某结点的指针,试编写算法,在链表中删除结点S的前趋结点.
题目就是上面那个,我想请您帮我写下完整的程序要C语言环境下直接可以运行的.......
谢谢帮忙了.......
最佳答案
- 五星知识达人网友:掌灯师
- 2021-07-25 20:43
已经测试通过,满意请采纳:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct _list {
int val;
struct _list* next;
} *node, list;
node Insert( node* head, node pos, int val )
{
node tmp;
tmp = ( node )malloc( sizeof( list ) );
tmp->val = val;
tmp->next = pos ? pos->next : *head;
if ( pos ) {
pos->next = tmp;
} else {
*head = tmp;
}
return tmp;
}
node Create( int* beg, int* end )
{
node head, t;
head = t = NULL;
while ( beg != end ) {
t = Insert( &head, t, *beg++ );
}
t->next = head;
return head;
}
void Print( node head )
{
node h = head;
do {
printf( "%d ", head->val );
head = head->next;
} while ( head != h );
putchar( '\n' );
}
int main()
{
int a[] = { 6,1,3,9,2,8,5,0,7,4 };
node h, S, t;
int i;
h = Create( a, a + 10 );
Print( h );
S = t = h;
srand( time( 0 ) );
for ( i = rand() % 100; i > 0; --i )
S = S->next;
while( t->next != S ) {
t = t->next;
}
printf( "node to be deleted: %d\n", S->val );
t->next = S->next;
free( S );
Print( t );
getchar();
return 0;
}
全部回答
就是一个环形链表嘛. S的前驱节点的Next指针肯定指向节点S. 那么就可以根据这个找出S的前驱节点.
这部分函数如下:
void DelS(LinkList S)
{
LinkList L=S,p;
while(L->Next->Next!=S)
{
L=L->Next;
}
p=L->Next; //p指向S的前驱节点.
L->Next=L->Next->Next; //从链表中去掉S的前驱节点.
delete p; //释放S的前驱节点.
}
- 2楼网友:轻熟杀无赦
- 2021-07-25 21:09
单链表,而且没有头指直,根据“某结点”是找不到他的前驱结点的,根本无法实现。
楼主是不是题错了?
我要举报
大家都在看
推荐资讯