C语言单链表去重,C语言字符串逆置

悠悠 2024-03-26 07:17 113阅读 0赞

C语言单链表去重

已知单链表的结点结构定义如下:

  1. typedef struct _NODE_
  2. {
  3. int data;
  4. struct _NODE_ *next;
  5. } NODE;

说明:data 为数据域。next 为指针域,指示后继结点。

请编写函数,删除带附加头结点的单链表中重复的数据结点。

函数原型
void Unique(NODE *head);
说明:参数 head 为单链表的头指针,函数将对单链表作去重处理:每个数据结点只保留第 1 个,后面与之重复的数据结点都被删去。

裁判程序

  1. int main()
  2. {
  3. NODE *h;
  4. Create(&h);
  5. Input(h);
  6. Unique(h);
  7. Output(h);
  8. putchar('\n');
  9. Destroy(&h);
  10. return 0;
  11. }

说明:Create 函数用于创建链表,Destroy 函数用于销毁链表。Input 函数用于输入链表:首先输入结点数,然后输入这些数据元素。Output 函数用于输出单链表,数据元素之间以空格间隔。

输入样例

  1. 16
  2. 28 47 52 28 36 47 52 47 28 28 95 47 36 28 47 95

输出样例

  1. 28 47 52 36 95

要求:时间复杂度为 O(n 2 ),空间复杂度为 O(1)。

提交代码:
算法思路:
首先是默认链表的默认节点是不重复的,然后以第一个节点为开头,然后一个个的往后走,如果后一个节点的值与当前的值相同了,那么就把当前节点的前一个节点的指针指向当前节点的后一个节点,然后再把当前节点给释放掉,这样就完成了,这个链表的去重了。

需要注意的是,在原来的链表的基础之上还需要创建两个新节点,便于进行操作。

  1. void Unique(NODE *head)
  2. {
  3. NODE *p = head->next, *q, *s;
  4. while(p)
  5. {
  6. s = p;
  7. q = p->next; // 默认第一个不重复
  8. while (q)
  9. {
  10. if (p->data == q->data)
  11. {
  12. s->next = q->next;
  13. q->next = NULL;
  14. free(q);
  15. }
  16. else
  17. {
  18. s = s->next;
  19. }
  20. q = s->next;
  21. }
  22. p = p->next;
  23. }
  24. }

C语言字符串逆置

请编写函数,将字符串逆置。

函数原型
char* StrReverse(char *str);
说明:str 为字符串起始地址。函数将字符串内容逆置,函数值为 str。

裁判程序

  1. #include <stdio.h>
  2. void ChrSwap(char *x, char *y);
  3. char* StrReverse(char *str);
  4. int main()
  5. {
  6. char a[1024];
  7. gets(a);
  8. StrReverse(a);
  9. puts(a);
  10. return 0;
  11. }

/* 你的代码将被嵌在这里 */
说明:ChrSwap 函数用于交换两个字符。

输入样例
roma
输出样例
amor

提交代码
算法思路:该算法的思路为使用二分交换的方法,以中间的那个字符的索引为标记,然后左右两边的互相交换。

  1. char* StrReverse(char *str)
  2. {
  3. int i = 0;
  4. int cnt = 0;
  5. while(str[i++] != '\0')
  6. {
  7. cnt++;
  8. }
  9. int m = cnt / 2;
  10. for(int i = 0;i < m; i++)
  11. {
  12. ChrSwap(&(str[i]), &(str[cnt - 1 - i]));
  13. }
  14. return str;
  15. }

发表评论

表情:
评论列表 (有 0 条评论,113人围观)

还没有评论,来说两句吧...

相关阅读

    相关 元素 C语言

    函数fun的功能是将不带头结点的单向链表逆置。 即若原链表中从头至尾结点数据域依次为:2、4、6、8、10 逆置后,从头至尾结点数据域依次为:10、8、6、4、2

    相关 实现(C++)

    对于单链表的逆置有两种方法可以实现 (1)利用辅助指针实现 基本思想:在遍历结点的过程中,设置辅助指针,用于记录先前遍历的结点。这样依次遍历的过程中只需修改其后继结点的ne

    相关 C语言实现

    单链表的逆置是一个非常经典的问题,这里利用两个思想进行解决。 首先,我们需要看下原理图,其实两个思想都是一样的,都是使后一个的节点的 next 指针指向前一个节点,依次递