c链表结点的删除和添加

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 typedef char datetype;/*定义新的数据类型名*/
 4 typedef struct node
 5 {
 6     datetype date;
 7     struct node *next;
 8 }listnode;
 9 typedef listnode *linklist;
10 int delete(linklist h,int num)/*删除结点*/
11 {
12     linklist p=h;
13     listnode *q=NULL;
14     int i=num;
15     int n=1;
16     while(n<i)/*寻找删除位置*/
17     {
18         q=p;/*该结点和前后两个结点*/
19         p=p->next;
20         n++;
21     }
22     if(p==NULL)/*该结点不存在*/
23         printf("No Found Node!");
24     else
25     {
26         q->next=p->next;
27         free(p);
28     }
29 }
30
31 void output(linklist head)/*链表遍历*/
32 {
33     linklist p=head;
34     while(p!=NULL)
35     {
36         printf("%c",p->date);
37         p=p->next;
38     }
39 }
40 int rear_creat(linklist head,int index0,int m)/*插入新结点,链表头,结点位置,结点date*/
41 {
42     linklist k,g;
43     int i=index0,n;
44     k=head;
45     n=1;
46     while(n<i)/*寻找结点位置*/
47     {
48         n++;
49         k=k->next;
50     }
51     g=(listnode *)malloc(sizeof(listnode));
52     g->next=k->next;
53     g->date=m;
54     k->next=g;
55 }
56 int main()
57 {
58     char ch;
59     int index,index0;
60     char m;
61     linklist head=NULL;
62     listnode *p,*r;
63     ch=getchar();
64     while(ch!=‘\n‘)
65     {
66         p=(listnode *)malloc(sizeof(listnode));
67         p->date=ch;
68         if(head==NULL)
69             head=p;
70         else
71             r->next=p;
72         r=p;
73         ch=getchar();
74     }
75     output(head);
76     printf("\ndelete a node:\n");
77     scanf("%d",&index);
78     if(index==1)
79         head=head->next;
80     else
81         delete(head,index);
82     output(head);
83
84     printf("\ncreat a node:\n");
85     scanf("%d%c",&index0,&m);
86     rear_creat(head,index0,m);
87     output(head);
88     return 0;
89 }
时间: 2024-10-16 02:27:48

c链表结点的删除和添加的相关文章

双链表(建立、删除、添加节点、打印)

#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <curses.h> using namespace std; typedef struct student { int data; struct student *next; struct student *pre; }dnode; dnode *creat() { dn

带表头链表结点的删除

#include <stdio.h> #include <stdlib.h> #define N 9 typedef struct node { int data; struct node *next; }ElemSN; ElemSN *Createlink(int a[],int n){ int i; ElemSN *h,*p; h=p=(ElemSN*)malloc(sizeof(ElemSN)); h->next=NULL; for(i=0;i<N;i++){ p

DSA——链表笔记【删除(3个),添加(2个),查找】【循环链表-画个图就明确了】

几个容易忽视的点儿,这里记一下 删除结点中,删除特定元素值结点及删除尾结点 都需要通过循环找到!注意!没有循环体,找到即可!! 一.删掉info=el的结点[注意链表为空!和只有一个结点!!]   public void delete(int el) { LinkedNode prev=null,temp=null; if(isEmpty()) return;//第一步就是判断是不是空链表 if(head==tail&&head.info==el)//如果只有一个结点,且 结点元素等于el

在O(1)时间删除链表结点

题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 链表结点与函数的定义如下: struct ListNode { int m_nValue; ListNode* m_pNext; }; void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted); 思路:我们可以很方便的得到要删除的结点的下一结点,如果我们把下一个结点的内容复制到需要删除的结点上覆盖原有的内容,再把下一个结点删除.就相当于把当前需要删除的

在O(1)时间删除链表结点——13

给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 因为要求时间复杂度为O(1),所以肯定不能遍历链表,那样的话时间复杂度就是O(N)了:可以想到,其实要求删除该结点,真正的目的并不是要将结点的数据包括结点所占的内存都给删除,只是想让数据消失就可以了,至于结点,除去任意一个结点所占的空间都是OK的: 所以,这里换一种思路,若要删除指定的结点,一般需要将前一个结点的next指针指向要删除结点的下一个结点,这样要删除的结点就可以脱离链表而被删除了,但这里关键就是即是单链表没有

C语言实现单链表节点的删除(带头结点)

我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https://github.com/chenyufeng1991/DeleteLinkedList_HeadNode.删除类型有两种: (1)删除某个位置pos的节点: (2)推断x值是否在链表中,若存在则删除该节点: 核心代码例如以下: //删除某个位置pos的节点 Node *DeletePosNode(Node

两种删除单链表结点的实现,一种O(n),一种O(1)

常规的删除单链表结点的做法是挨个查找到该结点的前一个结点,然后去掉要删除的这个结点,回收内存.这个需要O(n)的时间. 有一种比较快速的删除掉链表指定一个节点的方法,就是把下一个结点的内容复制到当前这个结点,然后把下一次结点删除掉,这个需要考虑当要删除的结点是最后一个结点的情况. 如果刚好是最后一个结点,则需要O(n)的时间,如果不是最后一个结点,可以在O(1)时间内完成删除操作. 1 // 2 // main.c 3 // SingleListDeleteNode 4 // 5 // Crea

时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法

有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和做法. 如图所示,删除结点 i,那么只需找到 i 的前驱 h,然后连 h 到 j,再销毁i 即可.虽然可以安全的删除 i 结点,但是是顺序查找找到 i,之后删除,时间复杂度是 O(n)级别的.具体做法就是:顺序查找整个单链表,找到要删除结点 i 的直接前驱 h,把 h额 next 指向i 的 nex

在O(1)时间内删除单链表结点

// 在O(1)时间内删除单链表结点 /* 思考: 很显然链表是一个节点地址不连续的存储结构 删除节点一般很容易会想到是修改p节点的前一个节点的next为p->next 然而除非是双向链表,否则无法在常量级的时间里找到p的前节点 转变思路: 既然改变不了p前节点的next 只能在p 本身动手脚 那可以考虑修改p->data 使得p->data的值为p->next->data的值,同样可以达到效果 */ #include <iostream> #include &l