当前位置:首页 » 编程语言 » c语言单链表删除节点
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言单链表删除节点

发布时间: 2023-04-21 13:06:10

‘壹’ 用c语言编写一个删除单链表中重复的结点的程序,该怎么写

图片早枝庆在哪里???
#include

#include

struct
node
{
int
num;
struct
node
*next;
};//定义节点
int
main()
{
struct
node
*p,*temp,*head;
int
i,a=1;
temp=(struct
node
*)malloc(sizeof(struct
node));//开辟一个节点空间搭族
temp->num=a;
head=p=temp;//得到头陆握结点
p->next=null;
for(i=0;i<9;i++)
{
a=a+2;
temp=(struct
node
*)malloc(sizeof(struct
node));
temp->num=a;
temp->next=null;
p->next=temp;
p=p->next;
}
p=head;
for(;p
!=
null;)//打印链表
{
printf("%d,"p->num);
p=p->next;
}
return
0;
}

‘贰’ 数据结构(C语言版)中的删除链表中的一个节点

代码如下:

#include <stdio.h>

#include <stdlib.h>

typedef struct List

{

int a;

List* next;

}list;

void newList(list* l)//创建结点

{

list* a[4];

for (int i = 0; i < 4; i++)

{

a[i] = (list*)malloc(sizeof(list));

a[i]->a = i+1 ;

}

l->next = a[0];

a[0]->next = a[1];

a[1]->next = a[2];

a[2]->next = a[3];

a[3]->next = NULL;

}

void printfList(list* l)//打印结点的数据内容

{

printf("该链表的内容是: ");

while (l->next)

{

printf("%d ", l->next->a);

l = l->next;

}

printf(" ");

}

void setList(list* l,int x,int y)

{

list* head = l;

l = l->next;

while (l)

{

if (l->a >=y || l->a <=x)//将结点的数据区与指定区域进行比较

{

head->next = l;//将满足条件的结点连接在新表的最后一个结点

//指针后移

l = l->next;

head = head->next;

}

else

{

//不满足的结点进行删除

list* l1 = l;

l = l->next;

free(l1);

}

}

head->next = NULL;

}

int main()

{

list* l = (list*)malloc(sizeof(List));

newList(l);//初始化链表

printfList(l);//输出旧表内容

setList(l,1,3);//进行修改

printfList(l);//输出修改后的链表

//system("pause");

return 0;

}

(2)c语言单链表删除节点扩展阅读

链表的特点

1、插入、删除数据效率高,时间复杂度为O(1)级别(只需更改指针指向即可),随机访问效率低,时间复杂度O(n)级别(需要从链头至链尾进行遍历)。

2、和数组相比,内存空间消耗更大,因为每个存储数据的节点都需要额外的空间存储后继指针。

常用的链表类型

1、单链表

1)每个节点只包含一个指针,即后继指针。

2)单链表有两个特殊的节点,即首节点和尾节点。用首节点地址表示整条链表,尾节点的后继指针指向空地址null。

3)性能特点:插入和删除节点的时间复杂度为O(1),查找的时间复杂度为O(n)。

2、循环链表

1)除了尾节点的后继指针指向首节点的地址外均与单链表一致。

2)适用于存储有循环特点的数据,比如约瑟夫问题。

3、双向链表

1)节点除了存储数据外,还有两个指针分别指向前一个节点地址(前驱指针prev)和下一个节点地址(后继指针next)。

2)首节点的前驱指针prev和尾节点的后继指针均指向空地址。

‘叁’ 建立带头节点的单链表,在单链表的第i节点之前插入一个新节点,删除第i个节点,用c语言写、拜托了

#include<stdio.h>
#include<stdlib.h>
#include<memory.h>

typedefstructLinkNode
{
intdata;
struct档岩漏LinkNode*pNext;
}LinkNode,*PNode;

//insertwithpositon
boolinsert(LinkNode*pHead,intdata,intiPos)
{
LinkNode*p=NULL,*pTmp=NULL;
LinkNode*pNewNode=(LinkNode*)malloc(sizeof(LinkNode));
pNewNode->data=data;
pNewNode->pNext=NULL;

p=pHead;
while((iPos-1)&&p->pNext){
p=p->pNext;
iPos--;
}

if(p->pNext==NULL){
p->pNext=pNewNode;
pNewNode->pNext=NULL;
}else{
pTmp=p->pNext;
p->pNext=pNewNode;
pNewNode->pNext=pTmp;
}

returntrue;
}

//deletewithposition
booldeletefun(LinkNode*pHead,intiPos)
{
LinkNode*p=pHead,*pTemp=NULL;
if(p->pNext==NULL)
returntrue;

while((iPos-1)&&p->pNext->pNext)
{
p=p->pNext;
iPos--;
}

pTemp=p->pNext;
if(p->pNext->pNext!=NULL){
p->pNext=p->pNext->pNext;
free(pTemp);
}else{
free(p->pNext);
p->pNext=NULL;
}
returntrue;
}

voidPrintLink(constLinkNode*pHead)
{
LinkNode*p=pHead->pNext;
while(p)
{
printf("%d ",p->data);
p=p->pNext;
}
printf("行烂 ");
}

intmain()
{
LinkNodeobHead;
obHead.pNext=NULL;
insert(&obHead,10,1);
insert(&obHead,100,1);
insert(&obHead,1000,1);
insert(&obHead,10000,1);
insert(&obHead,100000,1);
insert(&obHead,333,2);
PrintLink(&obHead);
deletefun(&obHead,2);
PrintLink(&枣郑obHead);
return0;
}

‘肆’ c语言结构体链表的节点删除问题 求助大佬

  • 这个出错点在行 while() 循环之后的那一句: free(l->tail); 第一段程序,其实在 while() 循环里面已经把全部节点都释放了,包括尾节点,所以第一段程序不需要再释放一次 l->tail,只需要保留 l->tail = NULL; 即可。 第二段程序,因为最后一个...

  • 2019-10-14回答者:隐世高手0074个回答

  • c语言中删除链表指定节点的一些问题?

  • 问:struct student *Del (struct student *head, int num) { struct studen...

  • 答:你仔细看看 while (p1->num != num && p1->next != NULL) 这一句之前的代码 p2什么时候赋值过? 而且if (p2 == head) //如果要删除的节点是第一个节点 既然是第一个节点,那么 while (p1->num != num && p1->next != NULL) 这个循环一次都没有执...

  • 2015-10-20回答者:知道网友1个回答2

  • C语言数据结构的链表删除与查找问题~~,实在是被弄...

  • 问:#include "stdlib.h" #include "stdio.h" typedef struct node{ //链表...

  • 答:#include #include typedef struct LNode {char character; struct LNode*next; }LNode,*PLNode; PLNode CreateList()/*创建单链表*/ {PLNode P,head,q; int i; head=(PLNode)malloc(sizeof(LNode)); p=head; p->next=NULL; for(i=0;icharacter=...

  • 2010-11-25回答者:qjbrh532个回答

  • C语言删除链表结点 结点结构如下

  • 问:#define ELEMTYPE char typdef struct node { ELEMTYPE date; struct no...

  • 答:我提供思路哈,你自己写一下,这个不难的。 分为两种情况: 1、删除的是头结点,这又可以分为两种情况:a)若是链表只有一个头结点,那么删除后头结点为NULL;b)若是链表不止一个节点,那么head指针指向头结点下一个节点。两种情况都要free 之...

‘伍’ c语言中删除链表中的一个节点

temp=p;
p=p->next;
temp->next=NULL;
这三句存在问题,temp=p,让temp指向p所指向的节点,p=p->next,p指向后移
temp->next=NULL,让temp的后继为空,这里出了问题,链表从temp指向的节点断开,相当于删除p之后的所有节点。

应该先判断p是不是最后节点
if(p->next==NULL)
如果是,只好去找p的前趋pre,让pre->next=NULL,free(p)
如果不是最后节点,将p的后继节点数值域复制给p,然后将p的后继节点删除,等同与删除p
p->data=p->next->data;
p->next=p->next->next;
free(p);

‘陆’ 用C语言编写一个使用递归算法实现删除单链表中值为X的第一个节点与所有节点

#include<stdio.h>吵乱
#include<stdlib.h>
typedef struct node
{
char data;
struct node* next;
}Lnode;
Lnode *head=NULL;
Lnode *tail=NULL;
void create()
{
head = (Lnode*)malloc(sizeof(Lnode));
tail = head;
if(head!=NULL)
{
printf("please input data: ");
scanf(" %c",&head->裂碰余data);
head->next=NULL;
}
}
void delFirst(Lnode *pre ,Lnode *ptr,char x) //递归删除肆滚第一个 = x
{
if(ptr==NULL)
return;
if(pre==NULL && ptr->data == x)
{
head=ptr->next;
ptr->next = NULL;
free(ptr);
ptr=NULL;
return;
}
if(pre!=NULL && ptr->data == x)
{
pre->next = ptr->next;
ptr->next = NULL;
free(ptr);
ptr = NULL;
return;
}
pre = ptr;
ptr = ptr->next;
delFirst(pre,ptr,x);
}
void delAll() //递归删除所有
{
Lnode * tmp=NULL;
if(head==NULL)
return;
if(head->next!=NULL)
{
tmp = head->next;
free(head);
head=tmp;
delAll();
}
else
{
free(head);
head=NULL;
}
}
void insert()
{
if(tail == NULL)
return;
tail->next = (Lnode*)malloc(sizeof(Lnode));
if(tail->next != NULL)
{
printf("please input data: ");
scanf(" %c",&(tail->next->data));
tail=tail->next;
tail->next=NULL;
}
}
void print()
{
Lnode* tmp =head;
if(head==NULL)
printf("no data\n");
while(tmp!=NULL)
{
printf("%c ",tmp->data);
tmp=tmp->next;
}
}
void lfree() //非递归删除
{
Lnode* tmp=NULL;
while(head!=NULL)
{
tmp=head;
head=head->next;
free(tmp);
}
}
void main()
{
int i=0;
create();
for(i=0; i<5; i++)
{
insert();
}
delFirst(NULL,head,'1');
print(head);
delAll();
print(head);
}

‘柒’ 数据结构代码(用C语言) 单链表的插入和删除

单链表功能大全,嘿嘿
#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
int nDate;
struct node *pstnext;
}Node;
//链表输出
void output(Node *head)
{
Node *p = head->pstnext;
while(NULL != p)
{
printf("%d ", p->nDate);
p = p->pstnext;
}
printf("\r\n");
}
//链表建立
Node* creat()
{
Node *head = NULL, *p = NULL, *s = NULL;
int Date = 0, cycle = 1;
head = (Node*)malloc(sizeof(Node));
if(NULL == head)
{
printf("分配内存失败\r\n");
return NULL;
}
head->好敏和pstnext = NULL;

p = head;
while(cycle)
{
printf("请输入数据且当输入数据为0时结束输入\r\n");
scanf("%d", &Date);
if(0 != Date)
{
s = (Node*)malloc(sizeof(Node));
if(NULL == s)
{
printf("分配内存失败\r\友盯n");
return NULL;
}
s->nDate = Date;
p->pstnext = s;
p = s;
}
else
{
cycle = 0;
}
}
p->pstnext = NULL;
return(head);
}
//单链表测长
void length(Node *head)
{
Node *p = head->pstnext;
int j=0;
while(NULL != p)
{
p = p->pstnext;
j++;
}
printf("%d\r\n", j);
}
//链表按值查找
void research_Date(Node *head, int date)
{
Node *p;
int n=1;
p = head->pstnext;
while(NULL != p && date != p->nDate)
{
p = p->pstnext;
++n;
}
if(NULL == p)
{
printf("链表中没有找到该值");
}else if(date == p->nDate)
{
printf("要查找的值%d在链表中第%d个位置\r\n", date, n);
}
return;
}
//按序号查找
void research_Number(Node *head, int Num)
{
Node *p=head;
int i = 0;
while(NULL != p && i < Num)
{
p = p->pstnext;
i++;
}
if(p == NULL)
{
printf("查找位置不合法\r\n");
}else if(i == 0)
{
printf("查找位置为头结点\r\n");
}else if(i == Num)
{
printf("第%d个位置数据为%d\r\n", i, p->nDate);
}
}
//在指定元素之前插入新结点
void insert_1(Node *head, int i, int Newdate)
{
Node *pre = head, *New = NULL;
int j = 0;
while(NULL != pre && j < i-1)
{
pre = pre->pstnext;
j++;
}
if(NULL == pre || j > i-1)
{
printf("插拿闹入位置不存在\r\n");
}else
{
New = (Node*)malloc(sizeof(Node));
if(NULL == New)
{
printf("分配内存失败\r\n");
return;
}
New->nDate = Newdate;
New->pstnext = pre->pstnext;
pre->pstnext = New;
}

}
//在指定元素之后插入新结点
void insert_2(Node *head, int i, int Newdate)
{
Node *pre = head, *New = NULL;
int j = 0;
while(NULL != pre->pstnext && j < i)
{
pre = pre->pstnext;
j++;
}
if(j == i)
{
New = (Node*)malloc(sizeof(Node));
if(NULL == New)
{
printf("分配内存失败\r\n");
return;
}
New->nDate = Newdate;
New->pstnext = pre->pstnext;
pre->pstnext = New;
}else
{
printf("插入位置不存在\r\n");
}
}
//删除指定结点
void Delete_1(Node *head, int i3)
{
Node *p = head, *pre = NULL;
int j = 0;
while(NULL != p && j < i3)
{
pre = p;
p = p->pstnext;
j++;
}
if(NULL == p)
{
printf("删除位置不存在\r\n");
}else
{
pre->pstnext = p->pstnext;
free(p);
}
}
//指定删除单链表中某个数据,并统计删除此数据的个数
int Delete_2(Node *head, int Delete_date)
{
int count = 0;
Node *p = head, *q;
while(NULL != p->pstnext)
{
q = p->pstnext;
if(q->nDate == Delete_date)
{
p->pstnext = q->pstnext;
free(q);
++count;
}
else
{
p = q;
}
}
return count;
}
//链表逆置
void Reverse_list(Node *head)
{
Node *q, *s;
if(NULL == head->pstnext || NULL == head->pstnext->pstnext)
{
return;
}
q = head->pstnext->pstnext;
head->pstnext->pstnext = NULL;
while(NULL != q)
{
s = q->pstnext;
q->pstnext = head->pstnext;
head->pstnext = q;
q = s;
}
}
//单链表的连接
void connect_list(Node *head, Node *head_New)
{
Node *p = head;
while(NULL != p->pstnext)
{
p = p->pstnext;
}
p->pstnext = head_New->pstnext;
}
//单链表销毁
void destroy_list(Node* head)
{
while (NULL != head)
{
Node* temp = head;
head = head->pstnext;
free(temp);
}
}
void main()
{
int date, num; //待查找数据
int i3; //指定删除元素的位置
int i1, i2, Newdate_1, Newdate_2; //待插入的新数据
int Delete_date, k; //待删除的数据与其个数
Node *Head = NULL; //定义头结点
Node *Head_New = NULL;

//链表建立
Head = creat();
printf("输出建立的单链表\r\n");
output(Head);

//单链表测长
printf("单链表长度为\r\n");
length(Head);

//链表按值查找
printf("请输入待查找的数据\r\n");
scanf("%d", &date);
research_Date(Head, date);

//链表按序号查找
printf("请输入待查找序号\r\n");
scanf("%d", &num);
research_Number(Head, num);

//在指定第i1个元素之前插入新元素Newdate
printf("在指定第i个元素之前插入新元素Newdate");
printf("请输入i与元素且以逗号间隔\r\n");
scanf("%d,%d", &i1, &Newdate_1);
insert_1(Head, i1, Newdate_1);
printf("插入后新链表\r\n");
output(Head);

//在指定第i2个元素之后插入新元素Newdate
printf("在指定第i个元素之后插入新元素Newdate");
printf("请输入i与元素且以逗号间隔\r\n");
scanf("%d,%d", &i2, &Newdate_2);
insert_2(Head, i2, Newdate_2);
printf("插入后新链表\r\n");
output(Head);

//指定删除i3元素
printf("删除元素的位置\r\n");
scanf("%d", &i3);
Delete_1(Head, i3);
printf("删除后新链表\r\n");
output(Head);

//指定删除单链表中某个数据,并统计删除此数据的个数
printf("请输入待删除的元素\r\n");
scanf("%d", &Delete_date);
k = Delete_2(Head, Delete_date);
printf("删除后新链表\r\n");
output(Head);
printf("删除指定元素在链表中的个数为:");
printf("%d\r\n", k);

//单链表逆置
Reverse_list(Head);
printf("逆置后输出\r\n");
output(Head);

//单链表的连接
printf("建立一个新链表\r\n");
Head_New = creat();
printf("输出新链表");
output(Head);
printf("将新链表连接到原来链表的尾部并输出\r\n");
connect_list(Head, Head_New);
output(Head);
destroy_list(Head);

return;
}

‘捌’ 用C语言编写程序:清空一个带头结点的链表 .

typedef int status;
typedef int Elemtype;
const int ok=1;
const int error=0;
const int overflow=-2;
const int TRUE=1;
const int FALSE=0;

typedef struct LNode{
Elemtype data;
struct LNode *next;
}LNode,*Linklist; //定义单链表的结点类型;

status initlist(Linklist &L) //初始化单链表;
{
L=(Linklist) malloc(sizeof(LNode));
if(!L) exit(overflow);
L->next=NULL;

//TODO1 生成单链表的头结点;

return ok;
}

status destroylist(Linklist &L) //销毁单链表;
{ while(L)
{ Linklist p=L->next;
free(L);
L=p;
}
//TODO2

return ok;
}

status listempty(Linklist &L) //判断单链表是否为空;
{ if(L->next==NULL)
return TRUE;
else return FALSE;
//TODO3

return TRUE;

}

int listlength(Linklist L) //求单链表的长度;
{ Linklist p=L->next;
int i=0;
while(p)

return i;
//TODO4

//p先指向第一个结点;
//计数器清0;
//当p所指向的结点存在,计数器加1,同时指针下移;
//while语句结束时,p移出单链表;
//返回单链表的长度;

}

void clearlist(Linklist &L) //清空单链表;
{while (L->next) {
Linklist p=L->next; L->next=p->next;

}

//TODO5
}

void printlist(Linklist L) //输出单链表里的每一个结点;
{
Linklist
p=L->next;
while(p)
{printf("%d",p->data);
p=p->next;
}
//TODO6
//p指向头结点;
//当p指向的结点存在,输出该结点,同时指针下移;

}

status getelem(Linklist L,int i,Elemtype &e)//取表中第i个元素放到变量e里;
{ Linklist p=L->next; int j=1;
while(p&&j<i)
e=p->data;
if(!p||j>i) return error;

//TODO7

//p首先指向第一个元素

//while语句结束时,如果第i个结点存在,p指向它;
//否则p指向表尾;

//表中不存迅镇在第i个结点或者表为空,返回出错信息;

}

status listinsert(Linklist &L,int i,Elemtype e)//向表中第i个元素的前面插入元素e;
{ Linklist p = L; int j = 0;
while (p && j < i-1)
// 寻找第 (i-1) 个结点
if (!p || j > i-1)
return error;
else
//TODO8
//p首先指向头结点;
//如果第i个结点存在,while语句激首结束时,p指向第i-1个结点;
//否则p指向表尾;
//生成新的结点;

//新的结点插入到p指向结点的后面(也就是插入到第i个结点的前面明昌数);

return ok;
}

status listdelete(Linklist &L,int i,Elemtype &e)//删除表L中第i个元素,结果用e返回. 操作成功返回ok,失败时返回error
{Linklist p = L; int j = 0;
while (p->next && j < i-1)
// 寻找第 i-1 个结点,并令 p 指向它。
if (p->next&& j == i-1)
{Linklist q = p->next; p->next = q->next; // 删除并释放结点
e = q->data; free(q);}
return ok;

//TODO9

}

‘玖’ C语言 单链表删除问题,为什么无法删除头节点

//LIST *delist(LIST *head,int num)
LIST *delist(LIST **head,int num) //<<<<******** 注意参数形橘脊式
{LIST *p1,*p2;
if( NULL==*head ) //if( NULL==head ) //<<<*head
{printf("it is a null list !");
return(NULL);
}

//for( p1=head;p1->date!=num&&p1->next!=NULL;p1=p1->next )
for( p1=*head;p1->date!=num&&p1->next!=NULL;p1=p1->next ) // *head
p2=p1;

if( num==p1->date )
{
if( p1==*head ) //if( p1==head )//圆尺渗*head
{*head=p1->next;} //{head=p1->next;}//<<<<<***** *head!!!!!
else
{p2->next=p1->next;}
}
else
{printf("NOT FOUND DATE");}

return(*head );//*head
}
//// 调用时要把首结点指针的地址传进去 调用困蠢方法: delist(&head, 5);

‘拾’ C语言单链表删除表中的大于min小于max的所有节点,我写了一个,但是一直运行不成功……

voidDelete(LNode*head,intmin,intmax)//删除大于Min小于Max的元素
{
LNode*p,*q;
p=head;
while(p->next!=NULL)
{
if(p->next->data<max&&p->next->data>min)
{
差明派q=p->next;
p->next=q->next;//删除指定的字虚贺符
free(q);
}
p=p->next;//不删除,只是槐州指针后移
}
}