导航:首页 > 编程系统 > 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删除链表相关的资料

热点内容
微信小程序按钮颜色 浏览:69
长江大学网课用什么app 浏览:431
华中系统图纸编程哪个刀好 浏览:38
地方债务数据在哪里查看 浏览:932
扫描文件怎么设置格式 浏览:957
苹果邮箱主机名填什么 浏览:630
多张图片同一个文件夹 浏览:798
win7怎么打开shs文件 浏览:481
怎么把文件夹做成iso 浏览:164
缤客网站上的房价怎么在哪里修改 浏览:406
单片机c51计数器实验代码 浏览:990
宏编程鼠标代表什么意思 浏览:753
别人捡到苹果6有用吗 浏览:829
word文件用wps打开 浏览:477
macbook修改文件格式软件 浏览:757
美版s7edge那个版本好 浏览:529
视频隐藏在文件夹里 浏览:144
网络通讯基础是什么 浏览:209
办公电脑文件管理 浏览:222
火化费报销文件有哪些 浏览:998

友情链接