单链表操作(头插、尾插、输出、插入、删除、查找、去重、求表长、连接)

it2024-07-31  38

#include<stdio.h> #include<malloc.h> //分配一块连续的内存 typedef int DataType; typedef char DataType1; typedef struct LNode { DataType1 data; struct LNode* next; }LNode, * LinkList;

头插法创建单链表

LinkList CreateListHead() //头插法创建单链表 { DataType1 ch; LinkList p, L; //p临时结点,L头指针 L = (LinkList)malloc(sizeof(LNode)); L->next = NULL; printf("\t\t\t请输入单链表元素:"); getchar(); while ((ch = getchar()) != '\n') { p = (LinkList)malloc(sizeof(LNode)); p->data = ch; p->next = L->next; L->next = p; } return L; }

尾插法创建单链表

LinkList CreateListTail() //尾插法创建单链表 { LinkList r, p, L; //r为尾指针 DataType1 ch; L = (LinkList)malloc(sizeof(LNode)); //初始化L L->next = NULL; r = L; printf("\t\t\t请输入单链表元素:"); getchar(); while ((ch = getchar()) != '\n') { p = (LinkList)malloc(sizeof(LNode)); p->data = ch; r->next = p; r = p; } r->next = NULL; return L; }

输出函数

void PrintList(LinkList L) //输出函数 { LinkList p; //p临时结点 p = L->next; printf("\t\t\t单链表为:"); while (p) { printf("%c ", p->data); p = p->next; } }

插入函数

LinkList Insert_List(LinkList L, int i, DataType x) //插入函数 { int j = 0; LinkList p = L, s; while (p && j < i - 1) { p = p->next; ++j; } if (!p || j > i - 1) return 0; s = (LinkList)malloc(sizeof(LNode)); s->data = x; s->next = p->next; p->next = s; return L; }

删除函数

LinkList Delete_List(LinkList L, int i) //删除函数 { int j = 0; LinkList p = L, s; while ((p->next) && (j < i - 1)) { p = p->next; ++j; } if (!(p->next) || j > i - 1) return 0; s = p->next; p->next = s->next; free(s); return L; }

按序号查找

LinkList LocateELem(LinkList L, DataType i) //按序号查找 { LNode* p; p = L->next; DataType j = 0; while (p && j < i - 1) { p = p->next; ++j; } if (!p || j > i - 1) return NULL; return p; }

按值查找

DataType LocateListItem(LinkList L, DataType1 x) //按值查找 { LNode* p = L->next; DataType i = 1; while (p && p->data != x) { p = p->next; i++; } if (!p) return 0; return i; }

链表去重

void DeleteList(LinkList L) //链表去重 { LNode* p, * q, * s; p = L->next; while (p && p->next) { q = p; while (q->next) if (p->data == q->next->data) { s = q->next; q->next = s->next; free(s); } else q = q->next; p = p->next; } }

求链表长

int Length_LinkList(LinkList L) //求链表长 { DataType len = 0; LNode* p; p = L->next; while (p) { len++; p = p->next; } return len; }

链表连接

LinkList Link(LinkList L, LinkList L1) //链表连接 { LNode* p, * q, * s; //p指向L开始结点,s指向表L头结点,q指向L1开始结点 s = L; p = L->next; q = L1->next; while (p) { p = p->next; s = s->next; } s->next = q; free(L1); return L; }

主函数

void ShowMenu() { printf("\n\t>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); printf("\n\t\t\t1.创建单链表L\n\t\t\t2.创建单链表L1"); printf("\n\t\t\t3.单链表插入操作\n\t\t\t4.单链表求表长"); printf("\n\t\t\t5.单链表删除操作\n\t\t\t6.单链表查找操作"); printf("\n\t\t\t7.显示表中数据\n\t\t\t8.单链表删除重复结点操作"); printf("\n\t\t\t9.单链表连接操作\n\t\t\t10退出\n"); printf("\t>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); } void main() { DataType flag = 1; DataType choice, choice1, choice2, choice3, len, num; LinkList L = NULL; LinkList L1 = NULL; LNode* p; DataType i, j, k; DataType1 x; while (flag) { ShowMenu(); printf("\n\t\t\t请输入要选择的操作:"); scanf("%d", &choice); switch (choice) { case 1: { printf("\n\t\t\t1.头插法创建\n\t\t\t2.尾插法创建"); printf("\n\t\t\t请输入要选择的操作:"); scanf("%d", &choice1); switch (choice1) { case 1:L = CreateListHead(); break; case 2:L = CreateListTail(); break; } break; } case 2: { printf("\n\t\t\t1.头插法创建\n\t\t\t2.尾插法创建"); printf("\n\t\t\t请输入要选择的操作:"); scanf("%d", &choice2); switch (choice2) { case 1:L1 = CreateListHead(); break; case 2:L1 = CreateListTail(); break; } break; } case 3: { printf("\t\t\t请输入插入位置:"); scanf("%d", &i); getchar(); printf("\t\t\t请输入插入元素:"); scanf("%c", &x); L = Insert_List(L, i, x); break; } case 4: { len = Length_LinkList(L); printf("\t\t\t表长为:%d\n", len); break; } case 5: { printf("\t\t\t请输入删除位置:"); scanf("%d", &j); L = Delete_List(L, j); break; } case 6: { printf("\n\t\t\t1.按序号查找\n\t\t\t2.按值查找"); printf("\n\t\t\t请输入要选择的操作:"); scanf("%d", &choice3); switch (choice3) { case 1: printf("\t\t\t请输入要查找的序号:"); scanf("%d", &k); p = LocateELem(L, k); printf("\t\t\t该序号下的值为%c", p->data); break; case 2: printf("\t\t\t请输入要查找的值:"); getchar(); scanf("%c", &x); num = LocateListItem(L, x); printf("\t\t\t要查找的值在第%d位", num); break; } break; } case 7:PrintList(L); break; case 8:DeleteList(L); break; case 9:L = Link(L, L1); break; case 10:flag = 0; } } }
最新回复(0)