导航:首页 > 编程系统 > linux删除链表

linux删除链表

发布时间:2021-02-23 15:53:50

㈠ 单链表删除操作

|// 删除节点,释放内存空间
p->next = p->next->next;
delete p->next;
******************************************
若链表为:
链表节点 | 1 | 2 | 3 |...
对应指针 | p | p->next | p->next->next|...

你想删除节点2(p->next),
但你的做法是:
p->next = p->next->next;(1的下一个由指向2改为指向3);
链表节点 | 1 | 2 | 3 |...
对应指针 | p | | p->next |...
delete p->next;(删除3)
这就错了,若要删除必须先将被删的节点2保存给临时变量,修改链表后再删除。正确的做法是:
linkList* tmp = NULL;
...
tmp = p->next;
p->next = p->next->next;
delete tmp;

另外,while (p && cnt != location - 1)这种写法虽然正确,但很不规范且危险,容易出现优先级和默认值的疏忽。

关于你补充的问题,不分析你的代码了,直接给你重写一个吧,看懂了就可以自己改了。
void Sort(linkList* L)
{
bool done_flag = FALSE;
linkList* p = L;
linkList* temp = NULL;

if (p->next == NULL)
{
return;
}

/*你的链表结构存在独立首节点,所以p可以直接做两个交换节点的父节点*/

/*若未发现乱序,说明已经排好*/
while(!done_flag)
{
done_flag = TRUE;

/*遍历链表 保证p下至少存在两个节点*/
while(p->next->next != NULL)
{
/*若顺序错误则对换*/
if (p->next->name[0] > p->next->next->name[0])
{
/*存在乱序*/
done_flag = FALSE;

/*链表:p p1 p2 p3*/
/*交换p1 p2*/

/*temp 指向 p1*/
temp = p->next;

/*p 的下一个改为 p2*/
p->next = p->next->next;

/*将 p3挂到p1后面,此时p的下一个是p2,所以p的下一个的下一个是p3,temp此时为p1*/
temp->next = p->next->next;

/*p 的下一个此时为 p2,将p2的下一个指向 temp(p1)*/
p->next->next = temp;
}

/*p后移*/
p = p->next;
}
}
}

bool你那里有问题的话,可以改为int或char。

结题吧。

㈡ 如何从linux链表删除元素

内核的链表list_head设计相当巧妙。今天我说一下对list_head链表的遍历时如何删除元素。内
链表遍历时,如果删除当前元容素,一般都是会出错的。在所有语言的各种库中的链表都是如此。list_head也一样。

㈢ 如何删除链表中的某个元素

单向链抄表节点的一般形式:
struct node{
int value;
node *next;};
每个袭链表节点的next成员即为指向下个节点的指针。
不管链表是单向链表还是双向链表或者其他什么形式,删除元素的思想是要知道即将被删除的元素,以及该元素的上一个节点和下一个节点。把即将被删除的元素的指针成员的值赋给其上一个节点的指针成员,再删除元素,就能完成任务。
比如要删除一个值为n的元素,我们可以如下判断:
node *temp = p->next;
if (temp->value == n){
p->next = temp->next;
delete temp;}
else
p = temp;
如此加上循环就能搜索链表中符合要求的元素并删除。

㈣ 假如要实现删除链表的算法DestroyList(LinkList &L),应如何实现

有点小错误

void DestroyList(LinkList L) // 和要抄求的不一致,应该是LiskList &L
{
node *pre,*p;
pre=L; // 指针和引用搞混

可以更简单一点:
void DestroyList(LinkList& L)
{
node *p = L.next;
while(p)
{
node *r=p;
p=p->next;
free(r);
}
L.next = NULL;
}

㈤ C++删除链表节点

struct student *del(struct *head,long num)
{struct student *p,*p2;
int n;
if(head==NULL)
{printf("\nlist null!\n");goto end;}
p2 = p = head;
while(num!=p->num&&p->next!=NULL)
{p2=p,p=p->next;}
if(num==p->num)
{
if(p==head)
head=p->next;
else p2->next=p->next;
prinf("delete:%d\n",num);
n=n-1;
}
else{printf("%d not been found!\n",num);
return(head);
}

㈥ 如何删除链表

head==NULL的意思是抄说根本就没有头结袭点!
根本就不可能有p1了!
删除头结点的话
pre=head;
if(head==NULL)
printf("该链表没有任何结点,无头结点可删!");
else
{
pre=pre->next;
free(head);
}
return
pre;

㈦ 怎样删除链表中的数据

如果链表表头不是设置成全局,可以用下面函数处理
//删除节点 删除值为m的节点
//*phead为表头指针
int deleteNode(LinkList *phead,int m)
{
LinkList p,q;//p为值是m的节点,q是p的前一个节点

if(*phead == NULL)//如果链表为空,做下溢处理
{
printf("单链表为空!\n");
return 0;
}
if((*phead)->data == m) //如果表头值为m,删除表头
{
p=*phead;
*phead=(*phead)->next;
free(p);//释放表头
}
else //从第二个节点查找值是m的
{
q=*phead;
p=(*phead)->next;
//注意先p !=NULL,否则因没有于m等值的节点将出现非法访问操作
while(p !=NULL && p->data!=m )
{
q=p;
p=p->next;
}

if(p!=NULL)//找到了
{
q->next=p->next;//让前一个节点指向p的后继节点
free(p);//删除节点p
}
else
{
printf("未找到值为%d的节点.\n",m);
return 0;
}
}

return 1;

}

㈧ 如何删除链表(C语言).

#include <stdlib.h>

typedef struct node
{
DataType value;
struct node *next;
}LinkList;

void list_destroy(LinkList *head)
{
LinkList *pdes;

for(pdes = head; NULL != head->next; pdes = head->next)
{
head->next = pdes->next;
free(pdes);
pdes = NULL;
}
}

㈨ 请高手回答 简单 链表删除 问题,。。。。。。。。。。。

void del(node *head,int n)
{
node *qq;
for(int i=1;i<n;i++)
head=head->next;
qq=head;
head=head->next;
free(qq);
}
如果head是你想删除的节点,那么你需要做的是让head的上一个节点的next指针指向head的下一个节点,从而跳过head,然后才能free head。你修改了head的next指针然后free了head,毫无意义。

但是,如果你想删除第一个节点(也就是del(head, 1)这样的),你将无法把新的“头节点”传回给main函数。

解决方法1:一个是保留一个永久的头节点,如果链表空,表示链表只有头节点。如果链表有1个元素,那么链表只有头节点和头节点后面紧挨着的一个节点。

解决方法2:你的del函数返回新的链表头节点。
node* del(node *head, int n)
{
node *pPre;
node *pNow;

if (!head)
return NULL;

if (1 == n)
{
node *result = head->next;
free(head);
return result;
}

pNow = head;
for(int i=1;i<n;i++)
{
pPre = pNow;
if (!pNow)
return head;
pNow=pNow->next;
}
pPre->next = pNow->next;
free(pNow);
return head;
}

然后调用时使用head = del(head, 3);

㈩ 链表删除节点 Linux 下 段错误

代码没有问题,可能是:
List->Head没有赋值。
链表最一个节点的Next没有设置为NULL。

阅读全文

与linux删除链表相关的资料

热点内容
为什么我开启不了wifi 浏览:725
苹果手机被偷如何销赃 浏览:309
iphone一个重力感应的松鼠游戏 浏览:403
new3ds不小心升级了 浏览:973
一次打开多个excl文件 浏览:633
怎么把整个电脑系统弄崩溃 浏览:900
致命格斗app 浏览:402
银行内控大数据 浏览:485
苹果oled屏幕花落那家 浏览:609
tif文件灰色微信打不开 浏览:32
惠普笔记本备份后怎么还原系统 浏览:862
exe视频文件加密了怎么转换格式 浏览:703
怎么改iphone信号 浏览:672
荣耀8手机系统更新 浏览:563
百度网盘文件夹加密 浏览:508
大数据难学么高数 浏览:611
手机编辑文件怎么保存不了 浏览:964
安卓手机ipad倒车影像 浏览:848
苹果6s64g怎么不满64g 浏览:143
js的时间控件 浏览:989